Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的队列设置超时_Javascript_Jquery - Fatal编程技术网

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毫秒。实际上刚才看到了托比上面的回答。这是一种更优雅的方式。让我看看他的回答。