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);

为什么它不只检测最后输入的内容并单独显示,而不重复输入的先前数据?

编辑:我注意到了一些东西。

它似乎也在吞下输入的内容,所以如果表是空的,我写“hi”,我得到你好,但是如果我写“你好”,我又得到“hi”,然后如果我写一些东西否则我会得到“你好”(而不是我刚刚写的)等等。

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 回答