javascript中的队列设置超时
我需要断断续续地闪烁一个元素。这是可行的,但我不太喜欢代码。有什么好办法吗javascript中的队列设置超时,javascript,jquery,Javascript,Jquery,我需要断断续续地闪烁一个元素。这是可行的,但我不太喜欢代码。有什么好办法吗 setTimeout(function(){ toggle(); setTimeout(function(){ toggle(); setTimeout(function(){ toggle(); setTimeout(function(){ toggle(); }, 100); }, 100); }, 100); }, 100);
setTimeout(function(){
toggle();
setTimeout(function(){
toggle();
setTimeout(function(){
toggle();
setTimeout(function(){
toggle();
}, 100);
}, 100);
}, 100);
}, 100);
如果有帮助的话,我也在使用jQuery。我会使用闪烁效果。对于jquery,希望它对您有用。
函数切换\u倍数(n)
function toggle_multiple(n)
{
var toggled = 0;
function toggle_one_time()
{
toggle();
toggled += 1;
if (toggled <= n)
setTimeout(toggle_one_time, 100);
}
toggle_one_time();
}
{
var-toggled=0;
函数切换一次
{
切换();
切换+=1;
如果(切换),您可以这样做:
function toggleMany(cnt) {
toggle();
if (--cnt >= 0) window.setTimeout('toggleMany('+cnt+')', 100);
}
toggleMany(4);
为什么不使用setInterval
var toggler = function() {
if (++self.counter >= self.BLINK_AMOUNT * 2) {
self.counter = 0;
window.clearInterval(self.timer);
return;
}
toggle();
};
toggler.BLINK_AMOUNT = 1;
toggler.counter = 0;
toggler.timer = window.setInterval(toggler, 100);
我不记得IE是否在计时器回调中正确实现了self变量-如果没有,请使用唯一命名的全局变量。为了简单起见,这里有另一个版本:
for (var i= 0; i<4; i++)
setTimeout(toggle, (i+1)*100);
对于(var i=0;i递归方法:
function multiTimeoutCall (callback, delay, times) {
if (times > 0){
setTimeout(function () {
callback();
multiTimeoutCall (callback, delay, times - 1);
}, delay);
}
}
用法:
multiTimeoutCall (toggle, 100, 4);
schedule(toggle, 4, 100);
编辑:另一种方法,不填充调用堆栈:
function multiTimeoutCall (callback, delay, times) {
setTimeout(function action() { // a named function expression
callback();
if (--times > 0) {
setTimeout (action, delay); // start a new timer
}
}, delay);
}
我可以使用参数.callee
而不是命名函数表达式,但它似乎有一天会在ECMAScript 5中被弃用…
用法:
multiTimeoutCall (toggle, 100, 4);
schedule(toggle, 4, 100);
如果只是需要闪烁,为什么不使用jQuery动画呢?我使用下面的命令来引导用户注意消息。但是你可以对任何元素都这样做-
$(“#消息框”).fadeOut(450).fadeIn(350);
如果你想要多次,就这样做-
$(“#消息框”).fadeOut(450).fadeIn(350).fadeOut(450).fadeIn(350);
记住eval是邪恶的!window.setTimeout(切换many,100,cnt)
在我看来要整洁得多。@nickf:是的,但有些浏览器在这方面有问题。字符串无处不在。-1.你应该始终将正确的JS函数传递给setTimeout,而不是将JS代码作为字符串传递。是的,我知道很久以前,setTimeout仅用于接受JS代码作为第一个参数。但是支持函数作为第一个参数自IE5/Netscape4以来,已添加了一项新功能(根据MS和Mozilla的文档进行验证).现在,绝对没有理由将JS代码传递给setTimeout,因为我相信当前所有浏览器都正确支持setTimeout。即使setTimeout存在问题,您也应该提到正确的解决方案,并发布您的版本作为替代解决方案,如果代码在浏览器中不起作用,OP是targetting、 self
是全局(窗口
)JavaScript中的对象。您可能正在考虑此
。不,此
不会指向任何浏览器上的切换程序,但由于您只是使用函数而不是完整方法,因此可以从参数中获得。被调用方
。好主意!这就是您所说的“跳出框框思考”。!:)toggled=0
可能应该有一个var
,以防止意外的全局错误。我建议将其重命名为toggle\u multiple&pass in amount作为参数。这样,这是一个更通用的解决方案。如果出于某种原因,浏览器变慢或忙,并且无法执行其中一个setTimeout,那么所有的计时都会被取消-yo你不能保证用这个循环调用切换函数的间隔是100毫秒。实际上刚才看到了托比上面的回答。这是一种更优雅的方式。让我看看他的回答。