如何在javascript中停止window.setInterval?
我有一个javascript函数,每2000ms调用一次。我想停止此操作,这样我就可以让用户在页面上执行其他操作,而无需再次调用它。这可能吗?以下是每2000ms调用一次的函数:如何在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
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);