如何在循环中缓存$(this)?

时间:2012-08-09 10:14:46

标签: javascript jquery

我有以下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)

1 个答案:

答案 0 :(得分:3)

请改为:

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

否则$body将成为全局变量,并将解析为当前正在处理的列表项。当循环结束时,它将解析为最后一个列表项。

由于回调在循环完成后执行$body将始终解析为列表中的最后一个元素。

使用var使$body成为.each()使用的函数范围链的一部分。这意味着$body将始终解析为“正确的”列表项。

要查看差异,请立即从此fiddle移除var前面的$body关键字并检查您的控制台。