为什么这个clearInterval总是在函数完成时工作?

时间:2014-01-09 09:42:47

标签: javascript ajax

我是网络编程的新手,我现在正在学习javascript和jquery ajax ..

这是我的javascript代码。刷新变量是每2秒刷新聊天的间隔(从数据库中获取聊天并在聊天容器中显示它们)。我想停止间隔,然后在提交消息后向容器添加新消息。

问题是当我按下回车键时,新聊天会附加到容器上,是的。但突然之间容器被刷新并用来自数据库的记录替换那条新消息(所以它已经消失了(clearInterval还没有工作))。当函数完成时,clearInterval正在工作..为什么?为什么? :(

var oldscrollHeight;
var newscrollHeight;
var refresh;
function refreshChats(){
  oldscrollHeight = $(".chatContainer").prop("scrollHeight");
  $.ajax({  
    url:"get_chats.php",  
    cache: false,  
    success: function(html){          
        $(".chatContainer").html(html);     

        //Auto-scroll             
        newscrollHeight = $(".chatContainer").prop("scrollHeight");  
        if(newscrollHeight > oldscrollHeight){  
            $(".chatContainer").prop({ scrollTop:         $(".chatContainer").prop("scrollHeight") });
       }                 
    }  
  });  
}

$("document").ready(function(){

  refresh = setInterval(refreshChats,2000);

  $(".chatValue").keypress(function(e){
    if(e.keyCode == 13 && $(".chatValue").val() != ""){
        clearInterval(refresh);
        var me = $(".me").val();
        var chat = $(".chatValue").val();
        var time = $(".timeChat").val();
        $(".chatContainer").append(me+": "+chat+" ("+time+")"); //showing a new message before database updated
        $(".chatValue").val("");
        $.post("chat.php",{submitChat: true,chat: chat,time: time});
    } 
  });

});

1 个答案:

答案 0 :(得分:1)

据推测refreshChats执行Ajax。

清除时间间隔后,可以阻止refreshChats再次运行。

如果HTTP请求已经已发送,则不会阻止事件处理程序在HTTP响应到达时触发,因此仍将处理响应。

您需要设置一个标志来取消响应的处理(或使成功处理程序中止而不做任何重要的事情)。