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

标签 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) 吗?

最佳答案

这样做:

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

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

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

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

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

关于javascript - 如何在循环中缓存$(this)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11881154/

相关文章:

javascript - html js - onclick 不工作

javascript - 如何在 JavaScript 中替换字符串中的多个 '+' 实例?

javascript - 按类查找从父元素开始的元素

jquery - 悬停一个 div,但由于位置 :absolute 而没有悬停在 main-div 之外的 div

jquery - 解释一下这个 jQuery 选择器?

javascript - 如何使用子 process.exec 模块切换或最小化窗口

javascript - 坚决 promise 并拒绝作为属性(property),这是一种反模式吗?为什么?

jquery - 如何在 TestCafe 中单击 jQuery 对话框按钮

chrome 的 jQuery .height() 问题

Javascript (jQuery) 模块/库加载