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被发送到setBodyGradient5 次,而不是$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将始终解析到列表中的最后一个元素。

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

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

于 2012-08-09T10:29:07.957 回答