Вопрос

Я использую setInterval(fname, 10000); для вызова функции каждые 10 секунд в JavaScript.Можно ли перестать вызывать его по какому-то событию?

Я хочу, чтобы пользователь мог остановить повторное обновление данных.

Это было полезно?

Решение

setInterval() возвращает идентификатор интервала, который вы можете передать clearInterval():

var refreshIntervalId = setInterval(fname, 10000);

/* later */
clearInterval(refreshIntervalId);

См. документацию для setInterval() и clearInterval().

Другие советы

Если вы установите возвращаемое значение setInterval в переменную, вы можете использовать clearInterval чтобы остановить это.

var myTimer = setInterval(...);
clearInterval(myTimer);

Вы можете установить новую переменную и увеличивать ее на ++ (подсчитывать единицу) каждый раз, когда она запускается, тогда я использую условный оператор, чтобы завершить ее:

var intervalId = null;
var varCounter = 0;
var varName = function(){
     if(varCounter <= 10) {
          varCounter++;
          /* your code goes here */
     } else {
          clearInterval(intervalId);
     }
};

$(document).ready(function(){
     intervalId = setInterval(varName, 10000);
});

Я надеюсь, что это поможет, и это правильно.

В ответах выше уже объяснялось, как setInterval возвращает дескриптор и как этот дескриптор используется для отмены таймера интервала.

Некоторые архитектурные соображения:

Пожалуйста, не используйте переменные без области видимости.Самый безопасный способ — использовать атрибут объекта DOM.Самым простым местом будет «документ».Если перепрошивка запускается кнопкой «старт/стоп», вы можете использовать саму кнопку:

<a onclick="start(this);">Start</a>

<script>
function start(d){
    if (d.interval){
        clearInterval(d.interval);
        d.innerHTML='Start';
    } else {
        d.interval=setInterval(function(){
          //refresh here
        },10000);
        d.innerHTML='Stop';
    }
}
</script>

Поскольку функция определена внутри обработчика нажатия кнопки, вам не нужно определять ее снова.Таймер можно возобновить, если нажать кнопку еще раз.

Уже ответил...Но если вам нужен функциональный таймер многократного использования, который также поддерживает несколько задач с разными интервалами, вы можете использовать мой Таймер задач (для узла и браузера).

// Timer with 1000ms (1 second) base interval resolution.
const timer = new TaskTimer(1000);

// Add task(s) based on tick intervals.
timer.add({
    id: 'job1',         // unique id of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (omit for unlimited times)
    callback(task) {
        // code to be executed on each run
        console.log(task.name + ' task has run ' + task.currentRuns + ' times.');
        // stop the timer anytime you like
        if (someCondition()) timer.stop();
        // or simply remove this task if you have others
        if (someCondition()) timer.remove(task.id);
    }
});

// Start the timer
timer.start();

В вашем случае, когда пользователи нажимают кнопку, чтобы помешать обновлению данных;ты также можешь позвонить timer.pause() затем timer.resume() если их нужно повторно включить.

Видеть больше здесь.

@cnu,

Вы можете остановить интервал, когда попытаетесь запустить код перед просмотром консоли браузера (F12)...попробуйте прокомментировать ClearInterval (триггер) - это снова консоль, а не украшатель?:П

Проверьте пример источника:

var trigger = setInterval(function() { 
  if (document.getElementById('sandroalvares') != null) {
    document.write('<div id="sandroalvares" style="background: yellow; width:200px;">SandroAlvares</div>');
    clearInterval(trigger);
    console.log('Success');
  } else {
    console.log('Trigger!!');
  }
}, 1000);
<div id="sandroalvares" style="background: gold; width:200px;">Author</div>

Объявить переменную для назначения значения, возвращаемого из SetInterval (...), и передайте назначенную переменную в clearInterval ();

например

var timer, intervalInSec = 2;

timer = setInterval(func, intervalInSec*1000, 30 ); // third parameter is argument to called function 'func'

function func(param){
   console.log(param);
}

// Везде, к чему у вас есть доступ таймер объявленный выше вызов ClearInterval

$('.htmlelement').click( function(){  // any event you want

       clearInterval(timer);// Stops or does the work
});

Метод ClearInterval() можно использовать для очистки таймера, установленного с помощью метода setInterval().

setInterval всегда возвращает значение идентификатора.Это значение можно передать в функциюclearInterval(), чтобы остановить таймер.Вот пример таймера, начинающегося с 30 и останавливающегося, когда он становится 0.

  let time = 30;
  const timeValue = setInterval((interval) => {
  time = this.time - 1;
  if (time <= 0) {
    clearInterval(timeValue);
  }
}, 1000);
var keepGoing = true;
setInterval(function () {
     if (keepGoing) {
        //DO YOUR STUFF HERE            
        console.log(i);
     }
     //YOU CAN CHANGE 'keepGoing' HERE
  }, 500);

Вы также можете остановить интервал, добавив прослушиватель событий, скажем, кнопку с идентификатором «stop-interval»:

$('buuton#stop-interval').click(function(){
   keepGoing = false;
});

HTML:

<button id="stop-interval">Stop Interval</button>

Примечание:Интервал все равно будет выполнен, но ничего не произойдет.

Почему бы не использовать более простой подход?Добавьте класс!

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

var i = 0;
this.setInterval(function() {
  if(!$('#counter').hasClass('pauseInterval')) { //only run if it hasn't got this class 'pauseInterval'
    console.log('Counting...');
    $('#counter').html(i++); //just for explaining and showing
  } else {
    console.log('Stopped counting');
  }
}, 500);

/* In this example, I'm adding a class on mouseover and remove it again on mouseleave. You can of course do pretty much whatever you like */
$('#counter').hover(function() { //mouse enter
    $(this).addClass('pauseInterval');
  },function() { //mouse leave
    $(this).removeClass('pauseInterval');
  }
);

/* Other example */
$('#pauseInterval').click(function() {
  $('#counter').toggleClass('pauseInterval');
});
body {
  background-color: #eee;
  font-family: Calibri, Arial, sans-serif;
}
#counter {
  width: 50%;
  background: #ddd;
  border: 2px solid #009afd;
  border-radius: 5px;
  padding: 5px;
  text-align: center;
  transition: .3s;
  margin: 0 auto;
}
#counter.pauseInterval {
  border-color: red;  
}
<!-- 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>


<p id="counter">&nbsp;</p>
<button id="pauseInterval">Pause</button></p>

Я долго искал этот быстрый и простой подход, поэтому публикую несколько версий, чтобы познакомить с ним как можно больше людей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top