Ajax聊天 - 只有在有变化时才更新

Dav*_*ave 8 javascript php ajax chat

我目前有一个基于Ajax的聊天,我试图通过仅在更新发生时加载聊天脚本来简化.因此,如果数据库中没有任何变化,则无需继续加载.

我现在的逻辑说:

  • JavaScript函数每1/2秒触发一次以获取聊天记录(setInterval())

但是,如果没有任何改变,那么继续调用它似乎相当低效.相反,我想做的是:

  1. JavaScript函数检查数据库中是否有日志
  2. 如果是 - 加载新日志,如果否 - 单独保留当前显示的日志.

但是我怎么会这样呢?我目前使用的功能是:

function updateShouts() {
    $('#chatArea').load('chat.php'); // load chat logs
}
setInterval("updateShouts()", 500);  // call function every half a second
Run Code Online (Sandbox Code Playgroud)

tim*_*dev 5

我会将timestamps(或message_ids)与服务器端脚本发送给客户端的任何聊天消息一起传递。然后客户端简单地请求新消息,服务器只发送新消息。

因此,假设每条聊天消息都有一个 ID。我会设计我chat.php接受这样的参数:

chat.php?since=12345
Run Code Online (Sandbox Code Playgroud)

12345将是id客户端看到的最后一条消息。chat.php本质上是这样的:

SELECT * FROM chatmessages WHERE id > $since
Run Code Online (Sandbox Code Playgroud)

...并传回一个漂亮的小数据结构(一个对象数组,以 JSON 编码,比方说)。

因此,如果没有新的聊天消息,服务器只会传回一个空数组。

我不认为你能比这更有效率。

编辑:

我意识到这样做需要更多的客户端编码。您不再只是用整个聊天记录更新某个 div。您还需要在 ajax 调用上有一个处理程序来迭代结果,并且对于每条消息,以编程方式div为该行构造一个,然后将其附加到您的 chat 中div


小智 1

如您所知,.load 函数使用 chat.php 文件返回的输出填充元素。这个 .load 函数执行两个步骤:它向 chat.php 发出 ajax 请求,然后将元素的值设置为 chat.php 的输出。你想做的只是第一步。为此,请使用 .ajax 函数

http://api.jquery.com/jQuery.ajax/

我建议不要使用 chat.php 文件,而是调用不同的脚本,例如 isChatUpdated.php。该脚本将按照名称所示执行操作,并检查聊天中是否有任何更改。然后,您可以使用该结果来确定是否需要调用 .load 函数。