在jQuery中,每隔5秒调用一个函数的最简单方法是什么?

641

JQuery如何每5秒调用一次函数。

我正在寻找一种自动更改幻灯片中图像的方法。

如果可能的话,我不想安装任何其他第三方插件。


144
如果可能的话,我宁愿不安装任何第三方插件。+1 - nickf
12
因为这很有趣,因为jQuery已经是第三方的了?(但实际上不是,因为我确定他已经在使用jQuery做其他东西了) - mpen
34
@Mark,呵呵,我不是在讽刺,只是我看到很多人直接使用插件,即使他们的问题可以用几行普通的 JavaScript 代码解决。 - nickf
9
几行古怪的技巧,你永远不知道它会在哪些浏览器中起作用。 - Gherman
12
请注意,对于那些希望将此技术与 AJAX 请求结合使用的人 - 不要这样做。让页面上的每个用户每 N 秒调用服务器等同于对自己进行 DDOS 攻击。如果需要使服务器和用户界面保持同步,请使用 WebSockets。 - Rory McCrossan
1
只是为了扩展@RoryMcCrossan的评论,如果您必须使用间隔(可能是由于技术原因),请使您的程序使连接失败增加重新连接尝试之间的延迟,而不是像一些netgear路由器过去那样减少。 - Ferrybig
7个回答

1127

你不需要使用jQuery,在纯JavaScript中,以下代码可以实现相同的功能:

var intervalId = window.setInterval(function(){
  // call your function here
}, 5000);

您可以使用以下代码来停止循环:

clearInterval(intervalId) 

49
谁说我不能每2秒刷新一次 :D - Doug Neiner
4
问者没有说明需要它停止,所以我认为不需要停止。 - andrewb
36
@andrewb然而,对于那些发现这个问题并确实需要clearInterval()的人来说,这仍然是有用的。 - Kimball Robinson
2
http://www.w3schools.com/jsref/met_win_clearinterval.asp - Ricardo Figueiredo
1
你写的函数比w3schools更简洁 - 干得好! - FontFamily

138

你可以使用 setInterval 在页面上注册一个间隔,例如:

setInterval(function(){ 
    //code goes here that will be run every 5 seconds.    
}, 5000);

2
好的,我已经修复了。我试图打得太快了,知道这个问题会很快得到解答 :) - John Boker
你的开头建议仍然提到了setTimeout :) - Sampson
1
好的,谢谢 :) 哥们儿,现在已经很晚了。疲惫时需要停止回答问题。 - John Boker
1
你可以在函数内部再次调用setTimeout……这是我以前的做法 >.< 我猜它不能是匿名函数。除非有一种我不知道的call_self()函数。 - mpen
@Mark 是的,当时间不是非常关键,但是需要定期执行作业时,这就是我所做的方式。 - HRJ
对于现在处于ES6世界的人来说,这应该很有用:setInterval(() => { alert("喵,我是一只猫"); }, 1000); - Oisín Foley

60

一个很好的例子,演示如何使用 setInterval() 订阅一个持续循环,并使用 clearInterval() 来停止这个无限循环:

function everyTime() {
    console.log('each 1 second...');
}

var myInterval = setInterval(everyTime, 1000);

调用此行以停止循环:

 clearInterval(myInterval);

50

第一条回答只是一个小提示。如果你的函数已经定义好了,那么引用函数时不要调用它!!!因此,在函数名称后面不要加任何括号。就像这样:

只需引用函数名而不调用它。

my_function(){};
setInterval(my_function,10000);

7
如果您没有第一次调用,第一次调用将在10000毫秒后进行。如果您想立即进行第一次调用,仍然可以正常调用一次。 - jeromej
这个答案为我节省了很多时间;我本来会一直想知道为什么我的函数没有被调用。幸运的是我偶然发现了这个答案;+1 - Often Right

38

以上提到的函数无论它之前是否完成执行,都会执行。这个函数在完成执行后,每隔 x 秒运行一次。

// IIFE
(function runForever(){
  // Do something here
  setTimeout(runForever, 5000)
})()

// Regular function with arguments
function someFunction(file, directory){
  // Do something here
  setTimeout(someFunction, 5000, file, directory)
  // YES, setTimeout passes any extra args to
  // function being called
}

14

无论是setInterval还是setTimeout都可以为您工作(如@Doug Neiner和@John Boker所写的一样,现在两者都指向setInterval)。
请查看此处,以获取有关两者的更多解释,看看哪个最适合您,以及如何停止它们中的每一个。


7

你可以使用window.setInterval函数,时间必须以毫秒为单位定义,在下面的例子中,该函数将在每一秒(1000毫秒)后调用。

<script>
  var time = 3670;
window.setInterval(function(){

  // Time calculations for days, hours, minutes and seconds
    var h = Math.floor(time / 3600);
    var m = Math.floor(time % 3600 / 60);
    var s = Math.floor(time % 3600 % 60);

  // Display the result in the element with id="demo"
  document.getElementById("demo").innerHTML =  h + "h "
  + m + "m " + s + "s ";

  // If the count down is finished, write some text 
  if (time < 0) {
    clearInterval(x);
    document.getElementById("demo").innerHTML = "EXPIRED";
  }

  time--;
}, 1000);


</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接