2012-03-01 57 views
0

我有一个使用jQuery和php的聊天框。在php和jQuery中优化聊天框

setInterval(
    function(){ 

     if($('#session_container').children().length > 0){ 
      if(localStorage['group_id']){ 
       var group_id = localStorage['group_id']; 
       var session_id = localStorage['session_id']; 
       var gsid = 'GSID' + group_id + session_id; 
       $('#chatbox').load('php/chatbox.php', {'group_id' : group_id, 'session_id' : session_id}, 
        function(){ 
         $('#chatbox').find('tr:even').addClass('alt'); 
         if($('#chatbox').children().length == 0){ 
          localStorage.clear(); 
          window.location.replace('chatro_main.php'); 
         } 
        } 
       ); 
      }else{ 

      } 
     } 
    }, 1000); 

正如你可以从上面的代码中看到,该脚本运行每隔一秒我认为这是非常积极的,我认为这也是浪费电力(我的笔记本电脑的电池似乎排水更快我跑这个时候) 。有没有更好的方式来做到这一点。就像用户在浏览器窗口的另一个选项卡上时不重新加载内容一样。或者像其他用户发送消息时只更新内容的东西? 如果您知道另一种可以以更优化的方式做到这一点的技术,您也可以提及它。

+1

[HTML5 WebSockets](http://weevilgenius.net/2010/10/html-5-websocket-chat-demo/)。 – 2012-03-01 06:19:30

回答

1

有几种可能的回答这个问题:

  1. 不要使用setInterval,但反复setTimeout和调整超时。这个想法是,你第一次尝试每10秒钟,然后增加时间,如果没有行动。因此,间隔将是:10,20,40,消息收到,10,20,消息收到,10,...你必须调整因素,你会实际增加超时,以适应您的需求。

  2. 使用的WebSockets(见@Christian瓦尔加的评论)

  3. 使用的node.js作为服务器端语言,它与客户端的JavaScript很好交互实现它。你可以让node.js向所有的客户端广播消息,所以你实际上有一个双向连接(我认为他们使用WebSockets并且像fallt.js那样回退,但我不确定,我只看到它完成一次)

1

其实这不是一个答案,但我不能让我的代表评论原因。我有一个像这样的聊天,但我有一个名为chatState的变种,当chatState为1(或者真)时,每隔一秒没有msg接收一个聊天状态时触发间隔为0(false)并清除该间隔并开始一个新的每10秒检查一次是否有人​​输入任何聊天内容?不知道这是一个好方法,但我认为这会更好的服务器原因较少的要求,但正如我所说不知道这是一个好方法,所以这将是一个评论,而不是答案。