我有一个使用jQuery和php的聊天框。
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);
正如你从上面的代码中看到的那样,脚本每隔一秒运行一次,我觉得它非常具有侵略性,而且我认为这也浪费了力量(我的笔记本电脑的电池在运行时似乎耗电更快)。有没有更好的方法来做到这一点。当用户在浏览器窗口的另一个选项卡上时,不会重新加载内容。或者像其他用户发送邮件时仅更新内容? 如果你知道另一种可以以更优化的方式做到这一点的技术,你也可以提一下。
答案 0 :(得分:1)
实际上这不是答案,但我不能对我的代表发表评论。我有这样的聊天,但我有一个名为chatState的var,当chatState为1(或者为真)时,如果没有收到一段时间的消息,则聊天时间间隔为0(错误)并清除该间隔并开始新的如果有人输入要聊天的内容,则每10秒检查一次?不确定这是一个好方法,但我认为这对服务器会更好,因为请求较少,但正如我所说不确定这是一个好方法所以这将是一个评论而不是答案。
答案 1 :(得分:1)
这个问题有几个可能的答案:
请勿使用setInterval
,而是反复setTimeout
并调整超时。这个想法是,你首先尝试每10秒,然后增加时间,如果没有动作。所以间隔时间是:10,20,40,收到消息,10,20,收到消息,10,......你必须调整实际因素增加超时以满足您的需求。
使用WebSockets实现它(参见@Christian Varga的评论)
使用node.js作为服务器端语言,它与客户端javascript很好地交互。你可以让node.js广播消息到所有客户端,所以你实际上有一个双向连接(我认为他们使用WebSockets和像fallt.js一样的后备,但我不确定,我只看到它做了一次)