0

基本的に、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';
}

それは私が予想していたより少し長かったです、しかしどんな助けやアイデアにも前もって感謝します...

4

2 に答える 2

1

リクエストに応じて、回答フォームで^^

.clickすべての返信に追加されるスクリプトを削除し、代わりにコードの$("#reply"+rnum).show("slow");document.getElementById("reply"+rnum).innerHTML=xmlhttp.responseText;に​​配置する必要があります。これが発生する理由はclick、ボタンに関連付けられた 2 つのイベントがあり、それらが互いに競合しているためです。また、応答を取得した後に.show配置することをお勧めします。応答を取得する前に空の div を表示するのではなく、何かを表示する必要があるからです。

于 2013-02-13T08:26:14.750 に答える
0

使用している最初のスニペットで

require 'comment_view.php';

これは、1 つのコメントに対して機能します。2 番目のコメントがあるとすぐに、エラーがスローされるはずcomment_view.phpです。に変更します

require_once 'comment_view.php';

そして今それが機能するかどうかを確認してください。

于 2013-02-13T07:46:36.840 に答える