如何在javascript中停止window.setInterval?

如何在javascript中停止window.setInterval?,javascript,jquery,Javascript,Jquery,我有一个javascript函数,每2000ms调用一次。我想停止此操作,这样我就可以让用户在页面上执行其他操作,而无需再次调用它。这可能吗?以下是每2000ms调用一次的函数: window.setInterval(function getScreen (sid) { if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new

我有一个javascript函数,每2000ms调用一次。我想停止此操作,这样我就可以让用户在页面上执行其他操作,而无需再次调用它。这可能吗?以下是每2000ms调用一次的函数:

window.setInterval(function getScreen (sid) {
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
          {
            document.getElementById("refresh").innerHTML=xmlhttp.responseText;
          }
        }
        xmlhttp.open("POST","getScreen.php?sid="+<?php echo $sid; ?>,true);
        xmlhttp.send();
    },2000);

没有内置的暂停功能,但您可以停止它,然后使用相同的功能启动新的间隔

首先,您需要捕获调用setInterval返回的id:

如果你想阻止它,打电话

 window.clearInterval(intervalId);

在您的情况下,我建议自己定义setScreen,而不是在调用setInterval的内部。通过这种方式,当您要恢复间隔时,只需使用intervalId=window.setIntervalsetScreen,2000即可。

您不能暂停间隔,但可以停止并重新启动间隔

var timer = setInterval(xx,tt);

// then some time later
clearInterval(timer);
您只需从setInterval捕获返回值,并在需要停止时调用clearInterval


另一种在任何时候都可以停止重复的重复方法是重复执行setTimeout,然后执行clearTimeout以停止下一个计时器,或者不启动下一个setTimeout。

使用window.setTimeout而不是window.setInterval更容易做到这一点。以下是根据我的回答改编的

现场演示:

代码:


如果您使用jQuery,我建议您使用该插件

然后,您可以轻松暂停计时器:

timer.pause();
并恢复:

timer.play();
不要再申报任何东西 只需添加一个类,告诉间隔不要做任何事情。例如:悬停

var i=0; window.setIntervalfunction{//声明新函数 if!$'counter'.hasClass'pauseInterval'{//仅当它没有此类'pauseInterval'时运行 $'showCount'.htmli++;//仅用于解释和显示 } }, 500; $'counter'.hover函数{//鼠标输入 $this.addClass'pauseInterval'; $“计数”。文本“停止计数…”; },函数{//鼠标离开 $this.removeClass'pauseInterval'; $“计数”。文本“计数…”; } ; 不要使用setInterval,尤其是在处理网络XHR/fetch调用时。无法保证您的请求会按时完成,但setTimeout不会等待启动下一个请求,从而打开越来越多的连接

只需使用一个setTimeout,它与一个简单的if语句一起重新调度自身

函数更新内容{ 有人答应了 .然后=>{ 如果继续{ setTimeoutupdateContent,2000年; } } .catch=>console.loge; } 更新内容
谢谢你的提示,这很有用。你能解释一下为什么这段代码会回答这个问题吗?不鼓励只使用代码的答案,因为它们不会教授解决方案。非常好!我很容易地从暂停延迟添加了一个启动。github上的计时器版本看起来更像是op的完美答案。泰!这是一个DoS漏洞。如果由于流量/负载的原因,XMLHttpRequest花费的时间超过2秒怎么办?您将堆积请求,并有导致服务器停机的风险。考虑阅读文章和使用超时或适当的调度代替。
var timer = $.timer(function() {
  alert('This message was sent by a timer.');
}, 2000, true);
timer.pause();
timer.play();
var intervalId = window.setInterval(code);
window.clearInterval(intervalId);