2011-11-04 149 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

謝謝。該解決方案對我無效(我確實修復了逗號>分號錯誤),但感謝您解釋問題,我將更多地研究這些腳本的異步性質! –

相關問題