0

長いポーリングを使用してテーブル データを更新する div があります。新しいテキストを入力する場合を除いてすべて機能します。その前に挿入されたテキストが常に最初に表示され、次に今書いたものが表示されます。

したがって、こんにちは、こんにちは、さようならと書くと、次のようになります。

hi
hi
hello
hello
goodbye

関連する JS:

var timestamp = null;
function waitForMsg() {
    $.ajax({
        type: 'GET',
        url: 'update.php?timestamp=' + timestamp,
        async: true,
        cache: false,

        success:function(data) {
            // alert(data);
            var json = eval('('+data+')');
            if (json['msg']) {
                $('.chat_contacts .inner_chat').append(json['msg']+'<br>'); // MD
            }
            timestamp = json['timestamp'];
            setTimeout('waitForMsg()', 1000);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            // alert('error '+textStatus+'('+errorThrown+')');
            setTimeout('waitForMsg()', 1000);
        }
    });
}

関連する update.php のスニペット

$response = array();

while($row = mysqli_fetch_assoc($r)) {
    $nou = $row['f1'];
    $nru = $row['f2'];
    $response['msg'] = $row['content'];
    $response['timestamp'] = $row['time'];
}

echo json_encode($response);

前に入力されたデータを繰り返さずに、最後に入力されたものを検出してそれだけを表示しないのはなぜですか?

編集:私は何かに気づきました。

また、入力されたものを飲み込んでいるように見えるので、テーブルが空の場合、「こんにちは」と書くと「こんにちは」と表示されますが、「こんにちは」と書くと再び「こんにちは」と表示され、何かを書くとさらに「こんにちは」と表示されますそうしないと、「こんにちは」(今書いたものではありません)などが表示されます。

4

1 に答える 1

1

$response['msg'] = $row['content'];と置き換えます$response['msg'][] = $row['content'];

そして以下のJSコードを変更

if (json['msg']) { 
    $('.chat_contacts .inner_chat').append(json['msg'] + '<br>');
} // MD 

if (json['msg'].length) { 
    var el = $('.chat_contacts .inner_chat');
    $.each(json['msg'], function(i, v) { 
        el.append(v + '<br>'); //MD 
    }); 
}   

そして、sql queryあなたがこのようなものを使用していることを確認してくださいWHERE time > timestamp

于 2013-07-20T13:31:03.493 に答える