如何在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);
window.setInterval(函数getScreen(sid){
if(window.XMLHttpRequest)
{//IE7+、Firefox、Chrome、Opera、Safari的代码
xmlhttp=新的XMLHttpRequest();
}
其他的
{//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
xmlhttp.onreadystatechange=函数()
{
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
document.getElementById(“刷新”).innerHTML=xmlhttp.responseText;
}
}
open(“POST”,“getScreen.php?sid=“+,true”);
xmlhttp.send();
},2000);
没有内置的“暂停”功能,但您可以停止它,然后使用相同的功能启动新的间隔

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

let intervalId = window.setInterval(...);
如果你想阻止它,打电话

 window.clearInterval(intervalId);

在您的情况下,我建议自己定义
setScreen
,而不是在调用
setInterval
的内部。通过这种方式,当您想要恢复间隔时,只需使用
intervalId=window.setInterval(setScreen,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;
setInterval(函数(){//声明新函数
if(!$('#counter').hasClass('pauseInterval')){//仅在没有此类'pauseInterval'时运行
$('#showCount').html(i++);//仅用于解释和显示
}
}, 500);
$('#计数器')。悬停(函数(){//鼠标输入
$(this.addClass('pauseInterval');
$('计数').text('停止计数…');
},函数(){//鼠标左键
$(this.removeClass('pauseInterval');
$('计数').text('计数…');
}
);


计数…|
不要使用
setInterval()
尤其是在处理网络(XHR/fetch)调用时。不能保证您的请求会按时完成,但
setTimeout()
不会等待启动下一个请求打开越来越多的连接

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


函数updateContent(){
某些函数返回承诺()
.然后(()=>{
如果(继续){
setTimeout(updateContent),2000年;
}
})
.catch(e=>console.log(e));
}
updateContent()

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