基本的に、Youtubeがコメントや返信を処理するのと同じように、ユーザーが「返信」コメントを表示できるように、AJAX/jQueryサポートを追加しようとしているコメントシステムがあります。
記事に関連付けられているすべてのコメント(comment_view.php)が表示され、別のコメントへの返信の場合は、ユーザーがクリックして返信中のコメントを表示できるボタンが表示されます。
最初のコメントが正常に表示され、[返信中]ボタンをクリックすると、期待どおりに返信が表示されます。ただし、返送されたばかりの返信から次の「返信中」ボタンをクリックしても何も起こりません。
もう1つの奇妙なことはstyle="display: none;"
、reply divを削除すると、jQueryの「show」アニメーションがなくても、すべての「replyto」を完全にプルするように見えることです。
ここで何が起こっているのかについて何か考えはありますか?
全部で、article.php、comment_view.php、getreply.phpの3つのファイルが含まれています。詳細は以下のとおりです。
article.php(スニペット)
このファイルはデータベースにヒットし、記事とそれに関連するコメントをプルします
foreach ($comments as $comment) {
echo '<div id="comment'.$comment['id'].'" class="comment">';
require 'comment_view.php';
echo '</div>';
}
comment_view.php
このファイルは、article.php(上記)とgetreply.php(以下、以下のJavaScriptからAJAXでフェッチされます)の両方に含まれています。
$_SESSION['rnum']++; //session variable that gets incremented to make sure each reply div id is unique
if ($comment['reply_to_id'] != null) {
echo '<div id="reply'.$_SESSION['rnum'].'" style="display: none;"></div>'; //empty/hidden div to hold the future contents of a reply, which ends up being this file, instantiated by getreply.php (below) with a new $comment from database
}
echo '<div class="content">';
echo nl2br($comment['content']);
if ($comment['reply_to_id'] != null) {
echo '<br/><button id="showreply'.$_SESSION['rnum'].'" onclick="showReply('.$comment['reply_to_id'].','.$_SESSION['rnum'].'); this.disabled = true;">In reply to -> '.$comment['reply_to_id'].'</button>';
echo '<script>$("#showreply'.$_SESSION['rnum'].'").click(function () { $("#reply'.$_SESSION['rnum'].'").show("slow"); });</script>';
}
echo '</div>'; //content
JavaScript(article.phpのヘッダーにあります)
このAJAX関数はcomid(コメントID)を受け取り、それをgetreply.phpに渡すので、データベースからプルする応答を認識します。また、rnumは、の内容を置き換える応答divの一意のIDを把握する必要があります。
<script>
function showReply(comid,rnum) {
if (comid=="") {
document.getElementById("reply"+rnum).innerHTML="";
return;
}
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else {
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("reply"+rnum).innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","getreply.php?id="+comid,true);
xmlhttp.send();
}
</script>
getreply.php
このファイルは、AJAXによって渡されたcomid(コメントID)を取得して、データベースから応答コメントをプルし、comment_view.phpを再度呼び出します(これにより、次の潜在的な応答用に別の新しい一意のrnumが生成され、コメントが吐き出されます)
session_start();
$query = "SELECT * FROM comments WHERE id = ".$_GET['id'];
$result = $mysqli->query($query) or die($mysqli->error. " [" . __LINE__ . "]");
if ($result->num_rows == 1) {
$comment = $result->fetch_assoc();
require 'comment_view.php';
}
それは私が予想していたより少し長かったです、しかしどんな助けやアイデアにも前もって感謝します...