【问题标题】:Ajax chat - only update if there's a changeAjax 聊天 - 仅在有变化时更新
【发布时间】:2011-03-02 18:42:42
【问题描述】:

我目前有一个基于 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

【问题讨论】:

    标签: php javascript ajax chat


    【解决方案1】:

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

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

    chat.php?since=12345
    

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

    SELECT * FROM chatmessages WHERE id > $since
    

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

    所以,如果没有新的聊天消息,服务器只是传回一个空数组。

    我认为没有比这更高效的了。

    编辑:

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

    【讨论】:

      【解决方案2】:

      我会首先创建一个名为 messages.php 的文件,它看起来像这样:

      <?php header('Content-Type: application/json');
      
      $messages_since = !empty($_POST['since']) 
          ? mysql_real_escape($_POST['since']) 
          : '0000-00-00 00:00:00');
      
      // Get all messages from database since the $messages_since date_time
      
      echo json_encode($array_with_messages);
      

      然后在客户端使用 jQuery 或类似的东西我会做这样的事情:

      1. 使用类似$.post('messages.php', new_messages_handler) 的方式获取消息
      2. 在处理程序中,我将为收到的每条新消息创建 html,并将其附加/前置到聊天容器中,并存储最新消息的创建时间。
      3. 等一下
      4. 使用类似$.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler) 的方式获取新消息
      5. 转到2

      至少它在我的脑海中效果很好:p

      【讨论】:

        【解决方案3】:

        一种相对简单的方法是使用 AJAX 获取一个页面,该页面简单地告诉您是否有任何更新。因此,例如,您可以获取像 checkForUpdate.php 这样的页面,其中包含 1 或 0 来指示聊天中是否有任何新内容。如果您得到 1 的回复,您可以继续加载完整的 chat.php 页面。

        (如果你之前没有使用过 AJAX,这是一个相当不错的教程:http://www.tizag.com/ajaxTutorial/

        另一种解决方案(我认为可能更好)是加载一个仅包含最新聊天行的页面。例如,假设您当前正在显示聊天的第 1-14 行。然后,您可以使用 AJAX 来获取例如 getLines.php?s=14 的内容。此页面将仅显示第 14 行之后的聊天行。然后您只需将这些行附加到当前聊天窗口的末尾即可。

        【讨论】:

          【解决方案4】:

          无论哪种方式,您都需要在服务器端查询数据库,因此返回日志数据或单个值几乎无关紧要。
          您可以根据返回值决定不更新#chatArea,但您必须再次调用以检索日志,否则。

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

            • 使用 Ajax 函数如何从检查 php 脚本中获取返回值?
            • 你必须指定一个“成功”回调函数。您将在我链接到的页面上看到它是如何工作的。
            猜你喜欢
            • 1970-01-01
            • 2019-03-07
            • 1970-01-01
            • 1970-01-01
            • 2011-06-01
            • 2023-02-25
            • 1970-01-01
            • 1970-01-01
            • 2016-09-19
            相关资源
            最近更新 更多