2012-08-09 70 views
2

我有以下的jQuery代碼:

$content.each(function(i) { 
    $body = $(this); 
    $(this).find('div.field-content') 
    .animate(
     { 
      'top': 0 
     }, 
     { 
      duration: 500, 
      complete: function() { 
       $(this).css('top', 0); 
       setBodyGradient($body); 
      } 
     } 
    ); 
}); 

在我的情況$content有5個項目。問題似乎是,在最後一次迭代中,$content.eq(0)的動畫完成回調尚未觸發,並且當它發生時,最新版本的$body發送到setBodyGradient 5次,而不是$body的版本回調已創建。

我應該說我在Drupal上運行JQuery 1.4.4,所以也許這是在最新的JQuery中修復的錯誤還是它的一個特性?

我知道我可以通過使用$content.eq(i)而不是避開它,不過我很好奇,想知道這是否是設計或錯誤行爲,什麼推薦的方法是什麼?我是否應該始終使用$content.eq(i)

回答

3

而是執行此操作:

$content.each(function(i) { 
    var $body = $(this); 

否則$body將是一個全局變量,將解決當前處理列表項。循環結束時,它將解析爲最後一個列表項。

由於在循環完成後執行回調,因此$body將始終解析爲列表中的最後一個元素。

使用var使得$body成爲.each()使用的函數的作用域鏈的一部分。這意味着$body將始終解析爲「正確」列表項。

若要查看其中的差異,請從fiddle中立即刪除前面的var關鍵字,然後檢查您的控制檯。

+0

哦,是的,謝謝有道理,它總是基本的東西,讓我:) – DanH 2012-08-09 13:04:17

+0

我不會說這是基本的東西,但很高興我可以幫助。看看http://stackoverflow.com/questions/500431/javascript-variable-scope更好的理解。 – 2012-08-09 13:10:31

相關問題