2010-06-11 59 views
8

我目前有一个基于Ajax的聊天,我试图通过仅在更新发生时加载聊天脚本来简化聊天。因此,如果数据库中没有任何更改,则无需继续加载。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 

回答

0

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

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

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

+0

随着Ajax的功能,你怎么从检查PHP脚本返回的值? – Dave 2010-06-13 16:06:26

+0

你必须指定一个“成功”回调函数。你会看到它在我链接到的页面上的工作原理。 – 2010-06-14 13:29:38

0

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

1

这样做的一个相对简单的方法是使用AJAX来获取一个页面,它只是告诉你是否有更新。举例来说,您可以获取一个像checkForUpdate.php这样的页面,该页面有1或0来指示聊天中是否有新内容。如果您有1回,您可以继续并加载完整的chat.php页面。

(如果你以前没有使用AJAX,这是一个很好的教程:http://www.tizag.com/ajaxTutorial/

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

+0

+1仅用于加载“新”(到客户端)行。 – timdev 2010-06-11 18:13:59

3

我会通过timestamp s(或message_id s)以及服务器端脚本发送给客户端的任何聊天消息。然后客户端只需要新的消息,服务器只发送新消息。

所以,想象每个聊天消息都有一个ID。我设计我chat.php接受一个参数,像这样:

chat.php?since=12345 

12345将是最后消息的客户已经看到的idchat.php本质上是做类似:

SELECT * FROM chatmessages WHERE id > $since 

...并传回一个不错的数据结构(对象数组JSON编码,让我们说)。

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

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

编辑:

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

0

我首先创建一个名为例如messages.php的文件看起来是这样的:使用jQuery或类似的东西我会做这样的事情

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

然后在客户端:

  1. 使用类似$.post('messages.php', new_messages_handler)
  2. 在处理程序中,我会为我们回到各自的新信息创建HTML和追加/前面加上它的聊天容器以及商店什么时候最新的MES获取信息圣人被创造出来。
  3. 等待一段时间
  4. 使用类似$.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)
  5. 去获得新的消息,2

至少它工作得很好在我的脑海:对