尝试删除问题!
答案 0 :(得分:0)
您可以使用object
每秒刷新一次
答案 1 :(得分:0)
你的ajax调用结构不正确,应该是:
$.ajax({...}).done(function(feedback){
$('div.chat_data').html(feedback);
setTimeout(refreshChat, 1000);
});
这样,您首先填充聊天,然后再拨打一个电话,以便在另一个电话完成之前不会进行新的呼叫。
编辑:您应该使用.done而不是.complete,因为.complete已弃用jquery 3.0以解决您的ajax承诺。
答案 2 :(得分:0)
我强烈建议不要使用同步AJAX调用,而是在每个请求上设置短暂超时并使用setInterval()
而不是setTimeout()
。 AJAX的重点在于它应该是异步的。这样,您的脚本可以在等待响应从服务器返回时继续执行其他操作,而不是长时间无响应。
其次,你有点Schlemiel the Painter问题。每次请求(每秒)您都会通过互联网发送整个聊天记录,而聊天记录实际上通常不会发生变化。只发送聊天室中发布的任何新消息会更有效率。
尝试修改PHP脚本以将一些JSON数据作为对象发回。让我们开始简单,并创建一个这样的对象,假设$log
包含最后几条聊天消息,$lastID
保存最后一条消息的ID。您的SQL查询将类似于:
SELECT `name`, `message` FROM `chatApp` WHERE ID > ?
参数填充了javascript提交的最后一个ID。 (不要忘记使用存储的参数,因为不信任用户)。
不要忘记设置正确的邮件标题:
$response = new \stdClass();
$response->changes = $log;
$response->messageID = $lastID;
header("Content-Type: text/json");
echo json_encode($response);
尝试修改javascript程序以每秒调用这样的例程:
$.ajax({
type: "POST",
url: "index.php",
data: {
lastMessageID: lastID
}
}).done(function( response ) {
$('div.chat_data').append(response.changes);
lastID = response.messageID;
});
现在我们尚未完全在那里。当请求花费的时间超过一秒时,您可以获得一些竞争条件。您应该做的是将每个聊天消息包装在其自己的元素中(例如,<div>
似乎最合适),并将更改后的聊天消息作为数组发送回来。
使用PHP的关联数组,您可以使用数据库行的ID作为数组键,并将整个数组放入$log
变量中。它在javascript端可读为response.changes[<N>]
,其中<N>
是一些元素ID。迭代response.changes
的成员,然后跳过已存在的任何消息。
为了将ID存储在DOM中,您可以使用以下内容:
<div class='chat_message' data-id=576><p>Hello World!</p></div>
表示聊天消息。然后,您可以quickly find发送与您的回复相符的任何邮件。您还可以使用jQuery的元素存储,或使用特定于chatapp对象的变量来缓存当前显示的消息ID。