Javascript 如何仅在需要时处理ajax请求,而不是在每一秒的时间内
基本上,我正在开发一个ajax聊天工具php、mysql、javascript和ajax 在代码中,我使用ajax获取div中的所有聊天消息,ajax函数每2秒运行一次 我的主要问题是div每2秒向下滚动一次,只有当所有聊天用户(不仅仅是我)都有新的条目向下滚动时,我才需要它向下滚动Javascript 如何仅在需要时处理ajax请求,而不是在每一秒的时间内,javascript,php,jquery,html,ajax,Javascript,Php,Jquery,Html,Ajax,基本上,我正在开发一个ajax聊天工具php、mysql、javascript和ajax 在代码中,我使用ajax获取div中的所有聊天消息,ajax函数每2秒运行一次 我的主要问题是div每2秒向下滚动一次,只有当所有聊天用户(不仅仅是我)都有新的条目向下滚动时,我才需要它向下滚动 function loadLog(){ var oldscrollHeight = $("#chatbox").attr("scrollHeight") - 20; $.ajax({
function loadLog(){
var oldscrollHeight = $("#chatbox").attr("scrollHeight") - 20;
$.ajax({
url: "ajaxchat.php",
cache: false,
success: function(html){
$("#chatbox").html(html); //Insert chat log into the #chatbox div
var newscrollHeight = $("#chatbox").attr("scrollHeight") - 20;
if(newscrollHeight > oldscrollHeight){
$("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); //i need to scroll if only there is new entry not every 2.5 sec
}
},
});
}
setInterval (loadLog, 2500); //Reload file every 2.5 seconds
你不能用台灯做这件事 您需要从服务器响应事件。 可以使用此堆栈执行此操作 NodeJS:Javascript在服务器端/ Socket.IO:实时服务器/客户端通信: Firebase:BaaS实时通信数据库 服务器需要对数据库事件做出响应。
PHP对客户端事件的响应。一个简单的解决方案是在更新聊天框之前检查新HTML与旧HTML是否不同。这将确保聊天室仅在从服务器获取新内容时更新。但是,如果您的响应HTML不一致,这将不起作用
var previousChatHTML = '';
function showChatMessages(html) {
if(previousChatHTML === html){
return;
}
var oldscrollHeight = $("#chatbox").attr("scrollHeight") - 20;
$("#chatbox").html(html); //Insert chat log into the #chatbox div
previousChatHTML = html;
var newscrollHeight = $("#chatbox").attr("scrollHeight") - 20;
if(newscrollHeight > oldscrollHeight){
$("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); //i need to scroll if only there is new entry not every 2.5 sec
}
}
function loadLog(){
$.ajax({
url: "ajaxchat.php",
cache: false,
success: showChatMessages,
});
}
setInterval (loadLog, 2500); //Reload file every 2.5 seconds
此外,在JS中创建轮询器时,您可能希望使用setTimeout而不是setInterval,因为在慢速连接上,如果请求花费的时间超过2.5秒,您可能会得到奇怪的结果,但它可能会以错误的顺序解决。您是否有一种方法,仅当聊天中有新条目时,我才能向下滚动div,对于这种聊天系统,并不总是需要实时服务器/客户端通信。但是我认为你可以做的不是每2秒加载所有消息,而是请求每2秒只获取最近的消息,然后将聊天推送到dom。你能举个例子吗?