我使用 setInterval(fname, 10000);
在 JavaScript 中每 10 秒调用一次函数。是否可以在某些事件上停止调用它?
我希望用户能够停止重复刷新数据。
setInterval()
返回一个间隔 ID,您可以将其传递给 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);
});
我希望它有所帮助,而且它是正确的。
clearInterval(varName);
。我希望 clearInterval
在传递函数名称时不起作用,我认为它需要间隔 ID。我想这只有在你有一个命名函数时才有效,因为你不能将匿名函数作为变量传递给它自己。
$(document).ready(function(){ });
是 jQuery,这就是它不起作用的原因。至少应该提到这一点。
varName
的变量,它存储一个未命名的函数 - wha??恕我直言,您应该更改或删除此答案。
已经回答...但是如果您需要一个特色的、可重复使用的计时器,它还支持不同时间间隔的多个任务,您可以使用我的 TaskTimer(用于节点和浏览器)。
// 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()
。
请参阅more here。
在 nodeJS 中,您可以在 setInterval 函数中使用“this”特殊关键字。
您可以使用此关键字来清除Interval,这是一个示例:
setInterval(
function clear() {
clearInterval(this)
return clear;
}()
, 1000)
当您在函数中打印 this 特殊关键字的值时,您会输出一个 Timeout 对象 Timeout {...}
为什么不使用更简单的方法?加一门课!
只需添加一个告诉间隔不要做任何事情的类。例如:悬停时。
变量 i = 0; this.setInterval(function() { if(!$('#counter').hasClass('pauseInterval')) { //只有在没有这个类时才运行 'pauseInterval' console.log('Counting.. .'); $('#counter').html(i++); //只是为了解释和展示 } else { console.log('停止计数'); } }, 500); /* 在本例中,我在 mouseover 上添加一个类,并在 mouseleave 上再次删除它。你当然可以随心所欲 */ $('#counter').hover(function() { //mouse enter $(this).addClass('pauseInterval'); },function() { //鼠标离开 $(this).removeClass('pauseInterval'); } ); /* 其他示例 */ $('#pauseInterval').click(function() { $('#counter').toggleClass('pauseInterval'); });身体{背景颜色:#eee;字体系列:Calibri、Arial、无衬线字体; } #counter { 宽度:50%;背景:#ddd;边框:2px 实心#009afd;边框半径:5px;填充:5px;文本对齐:居中;过渡:.3s;边距:0 自动; } #counter.pauseInterval { 边框颜色:红色; }
多年来,我一直在寻找这种快速简便的方法,因此我发布了几个版本,以向尽可能多的人介绍它。
this.setInterval(function() { if(!$('#counter').hasClass('pauseInterval')) { //do something } }, 500);
是您所拥有的所有代码。此外,检查是您要做的第一件事,因此在悬停时它非常轻巧。这就是它的用途:暂时暂停功能。如果你想无限期地终止它:当然你删除了间隔。
clearInterval
。我使用window.refreshIntervalId
而不是局部变量,效果很好!$('foo').data('interval', setInterval(fn, 100));
,然后用clearInterval($('foo').data('interval'));
清除它我确信也有一种非 jQuery 方法可以做到这一点。