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)最新バージョンが5 回$body送信されることです。 .setBodyGradient$body

私は Drupal で JQuery 1.4.4 を実行していると言わざるを得ないので、おそらくこれは最新の JQuery で修正されたバグですか、それとも機能ですか?

代わりに使用することで回避できることはわかっていますが、$content.eq(i)これが設計によるものなのか、バグのある動作なのか、推奨される方法は何ですか? 常に使用する必要があります$content.eq(i)か?

4

1 に答える 1

3

代わりにこれを行ってください:

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

それ以外の場合$bodyはグローバル変数になり、現在処理中のリストアイテムに解決されます。ループが終了すると、最後のリストアイテムに解決されます。

ループが完了した後にコールバックが実行されるため、$body常にリストの最後の要素に解決されます。

を使用varすると$body、で使用される関数のスコープチェーンの一部になります.each()。これは、$body常に「正しい」リスト項目に解決されることを意味します。

違いを確認するには、このフィドルvarの直前にあるキーワードを削除して、コンソールを確認してください。$body

于 2012-08-09T10:29:07.957 に答える