2011-11-04 150 views
3

我有这样的:让jQuery等待一个.each函数在下一行执行之前完成?

$("a.fadeout").click(function(event){ 
    event.preventDefault(); 
    var loc = this.href; 

    //Do this first... 
    $($(".faded").get().reverse()).each(function(i) { 
     $(this).delay(i * 100).fadeOut(); 
    }); 

    //And only then do this.. 
    window.location = loc; 

}); 

如何强制fadeouts前的位置变化来完成?如果它只是一个fadeOut(),我会使用它的回调函数,但由于有很多,我无法弄清楚如何去做。

干杯! Ben

+0

这里的问题不在'.each()'函数中,因为它会在下一行执行之前完成。它使用'.delay()'函数,延迟的时间比通过'.each()'函数运行并执行下一行所需的时间长。 – jtfairbank

回答

2

以下works;

$("a.fadeout").click(function(event){ 
    event.preventDefault(); 

    var loc = this.href; 
    var amount = $($(".faded").get().reverse()).each(function(i) { 
     $(this).delay(i * 100).fadeOut(function() { 
      if (i == amount -1) { 
       window.location = loc; 
      } 
     }); 
    }).length; 
}); 

这是我能想到的最干净的方式。我们存储元素的总量,并检查回调fadeOut是否是最后一次回调被绑定。如果是,则执行重定向。

+0

不起作用。 '.each(function(i){...})'的回调函数在'length'属性被保存并可以在'amount'变量中访问之前执行。在这里测试:http://jsfiddle.net/Udj7V/ – buschtoens

+0

@silvinci:情况并非如此。问题是'我'是零索引,并且我错过了支票上的'-1';见http://jsfiddle.net/Udj7V/2/ – Matt

+1

你是对的。有趣的 - 我们来到相同的解决方案...但你设法用较少的变量做到这一点) – buschtoens

1

它可以是:

$("a.fadeout").click(function(event){ 
    event.preventDefault(); 
    var loc = this.href; 
    var list = $($(".faded").get().reverse()); 
    var size = list.length; 
    var count = 0; 
    list.each(function(i) { 
     $(this).delay(i * 100).fadeOut(function() { 
      if (++count == size) { 
       window.location = loc; 
      } 
     }); 
    }); 
}); 
+0

嗨,这也适用于我,但我用马特的,因为它看起来只是一个小整洁。纯粹的美学:) –

0

欢迎的事件 - 基于非线性的世界async

$(this).delay(i * 100)创建新的setTimeout()。这并不会导致整个脚本暂停,否则整个浏览器会冻结这段时间。 jQuery提供了一些方法来处理这种问题,但是以这种方式来做这件事是不可能的。每当制作​​时,您都必须进行检查。

$("a.fadeout").click(function(event){ 
    event.preventDefault(); 
    var loc = this.href, 
     $stack = $(".faded").get().reverse(); 

    //Do this first... 
    $($stack).each(function(i) { 
     $(this).delay(i * 100).fadeOut().queue(function() { 
      if($stack.lenght <= i+1) { 
       window.location = loc; 
      } 
     }); 
    }); 
}); 

jsFiddle上测试它。

+0

谢谢。该解决方案对我无效(我确实修复了逗号>分号错误),但感谢您解释问题,我将更多地研究这些脚本的异步性质! –

相关问题