Javascript 如何仅在需要时处理ajax请求,而不是在每一秒的时间内

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({

基本上,我正在开发一个ajax聊天工具php、mysql、javascript和ajax 在代码中,我使用ajax获取div中的所有聊天消息,ajax函数每2秒运行一次

我的主要问题是div每2秒向下滚动一次,只有当所有聊天用户(不仅仅是我)都有新的条目向下滚动时,我才需要它向下滚动

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。你能举个例子吗?