Подтвердить что ты не робот

Как остановить window.setInterval в javascript?

У меня есть функция javascript, которая вызывается каждые 2000 мс. Я хочу остановить это, поэтому я могу заставить пользователя делать другие вещи на странице, не вызывая его снова. Это возможно? Вот функция, которая вызывается каждые 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);
4b9b3361

Ответ 1

Там нет встроенной функции "паузы", но вы можете остановить ее, а затем начать новый интервал с той же функцией.

Во-первых, вам нужно захватить идентификатор, возвращаемый вызовом setInterval:

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

Затем, когда вы хотите остановить это, позвоните

 window.clearInterval(intervalId);

В вашем случае я бы предложил определить setScreen самостоятельно, а не внутри вызова setInterval. Таким образом, вы можете просто использовать intervalId = window.setInterval(setScreen, 2000) когда хотите возобновить его.

Ответ 2

Если вы используете jQuery, я бы порекомендовал плагин jQuery Timer

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

Затем вы можете легко приостановить таймер:

timer.pause();

И также возобновите его:

timer.play();

Ответ 3

Это проще сделать, используя window.setTimeout() вместо window.setInterval(). Ниже приведен мой ответ здесь.

Live demo: 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();
}

Ответ 4

Вы не можете приостановить интервал, но вы можете остановить его и перезапустить.

var timer = setInterval(xx,tt);

// then some time later
clearInterval(timer);

Вам просто нужно взять возвращаемое значение из setInterval() и вызвать clearInterval() на нем, когда вы хотите его остановить.

Другой способ повторить, что вы можете прекратить повторять в любое время, - это повторить setTimeout(), а затем clearTimeout(), чтобы остановить следующий таймер или просто не запускать следующий setTimeout().

Ответ 5

Не повторяйте объявление

Просто добавьте класс, который сообщает интервалу ничего не делать. Например: при наведении указателя мыши.

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>

Ответ 6

var intervalId = window.setInterval(code);
window.clearInterval(intervalId);

Ответ 7

Не используйте setInterval(), особенно когда речь идет о сетевых вызовах (XHR/fetch). Нет никакой гарантии, что ваш запрос будет выполнен вовремя, но setTimeout() не будет ждать setTimeout() следующего, открывающего все больше и больше соединений.

Просто используйте setTimeout(), который с помощью простого оператора if перенесет себя.


function updateContent() {
    someFunctionReturningAPromise()
        .then(() => {
            if (continue) {
                setTimeout(updateContent), 2000);
            }
        })
        .catch(e => console.log(e));
}

updateContent()