如何在 javascript 中停止 window.setInterval?

IT技术 javascript jquery
2021-01-24 15:34:45

我有一个每 2000 毫秒调用一次的 javascript 函数。我想停止这个,这样我就可以让用户在页面上做其他事情而不会被再次调用。这可能吗?这是每 2000 毫秒调用一次的函数:

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);
6个回答

没有内置的“暂停”功能,但您可以停止它,然后使用相同的功能开始一个新的间隔。

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

let intervalId = window.setInterval(...);

然后当你想停止它时,调用

 window.clearInterval(intervalId);

在您的情况下,我建议setScreen自己定义,而不是在setInterval. 这样你就可以intervalId = window.setInterval(setScreen, 2000)在你想恢复它的时候使用它。

如果您使用 jQuery,我会推荐插件jQuery Timer

var timer = $.timer(function() {
  alert('This message was sent by a timer.');
}, 2000, true);

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

timer.pause();

并恢复它:

timer.play();
谢谢你的提示,很有用。
2021-03-22 15:34:45

使用window.setTimeout()代替更容易做到这一点window.setInterval()以下内容改编自我在这里的回答

现场演示:http : //jsfiddle.net/timdown/Hkzex/

代码:

function RecurringTimer(callback, delay) {
    var timerId, start, remaining = delay;

    this.pause = function() {
        window.clearTimeout(timerId);
        remaining -= new Date() - start;
    };

    var resume = function() {
        start = new Date();
        timerId = window.setTimeout(function() {
            remaining = delay;
            resume();
            callback();
        }, remaining);
    };

    this.resume = resume;

    this.resume();
}
非常好!我设法很容易地从暂停延迟中添加了一个启动。你在 github 上也有的 Timer 版本似乎更像是 op 的完美答案。泰!
2021-04-01 15:34:45

您无法暂停间隔,但可以停止并重新启动它。

var timer = setInterval(xx,tt);

// then some time later
clearInterval(timer);

您只需要从中捕获返回值setInterval()clearInterval()在想要停止它时调用它。

另一种可以随时停止重复的重复方法是重复重复setTimeout(),然后clearTimeout()停止下一个计时器,或者只是不要开始下一个setTimeout()

不要重新声明任何东西

只需添加一个类,告诉间隔不要做任何事情。例如:悬停时。

var i = 0;
window.setInterval(function() { //declare new function
  if(!$('#counter').hasClass('pauseInterval')) { //only run if it hasn't got this class 'pauseInterval'
    $('#showCount').html(i++); //just for explaining and showing
  }
}, 500);

$('#counter').hover(function() { //mouse enter
    $(this).addClass('pauseInterval');
    $('#counting').text('Stopped counting...');
  },function() { //mouse leave
    $(this).removeClass('pauseInterval');
    $('#counting').text('Counting...');
  }
);
<!-- you'll need jQuery for this. If you really want a vanilla version, ask -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div id="counter"><span id="counting">Counting...</span> | <span id="showCount"></span></div>