我有以下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)
?
答案 0 :(得分:3)
请改为:
$content.each(function(i) {
var $body = $(this);
否则$body
将成为全局变量,并将解析为当前正在处理的列表项。当循环结束时,它将解析为最后一个列表项。
由于回调在循环完成后执行$body
将始终解析为列表中的最后一个元素。
使用var
使$body
成为.each()
使用的函数范围链的一部分。这意味着$body
将始终解析为“正确的”列表项。
要查看差异,请立即从此fiddle移除var
前面的$body
关键字并检查您的控制台。