2011-09-25 68 views
10

我正在使用JavaScript和jQuery。我有以下脚本每30秒提醒hiJavaScript - jQuery间隔

$(document).ready(function() { 
    alert("hi"); 
setInterval(function() { 
    alert("hi"); 
}, 30000); 
}); 

我想提醒hi加载网页时(当文件/页面变得完全加载)和每30秒间隔后(如hi(0) - hi(30秒) - hi(60)..等等)。但我的解决方案适用于两个实例。一个用于DOM准备,另一个用于循环。有没有办法在单个实例中执行相同的操作?

你可以看到我的小提琴here

+0

什么问题?您的jsFiddle最初和每隔30秒都会按照代码指定的方式发出警报。在时间流逝之前,setInterval不会调用它的函数。如果你想让它最初执行,那么你就像你一样调用它。如果这是一个更复杂的逻辑你想在这两个地方调用,然后把它放在一个命名函数,你可以调用这两个地方。 – jfriend00

回答

18

您可以改用setTimeout,并让回调自行重新安排。

$(function() { 
    sayHi(); 

    function sayHi() { 
     setTimeout(sayHi,30000); 
     alert('hi'); 
    } 
}); 
+0

为什么不使用setInterval? – user2019515

+0

@ user2019515 - 我了解OP希望单个函数的调用。 '$(function(){sayHi(); setInterval(sayHi,30000); function sayHi(){alert('hi');});'也可以工作,但有单独的函数实例。 – tvanfosson

9

把你的代码包装在一个函数中。然后,传递给函数的第一个参数setInterval,并调用该函数:

$(document).ready(function() { 
    //Definition of the function (non-global, because of the previous line) 
    function hi(){ 
     alert("hi"); 
    } 

    //set an interval 
    setInterval(hi, 30000); 

    //Call the function 
    hi(); 
}); 
1

不,那是不可能的setInterval。你可以使用的setTimeout例如:

function foo() { 
    alert('hi'); 
    setTimeout(foo, 30000); 
} 

$(function() { 
    foo(); 
}); 
1
$(function() { 

    function heythere() { 
     alert('hi'); 
     setTimeout(heythere,30000); 
    } 

    heythere(); 

}); 

如果你想让它只有30秒后运行一次,你正在寻找使用setTimeoutsetInterval

3

嗯,有可能是在只需一个电话做这件事的方式..

setInterval(
    (function x() { 
     alert('hi'); 
     return x; 
    })(), 30000); 

另一种解决方案是使用arguments.callee,但因为它是现在已经过时,所以一般不建议用它。

setInterval(
    (function() { 
     alert('hi'); 
     return arguments.callee; 
    })(), 30000);