2012-08-09 54 views
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发送到setBodyGradient 5次,而不是$body的版本回调已创建。

我应该说我在Drupal上运行JQuery 1.4.4,所以也许这是在最新的JQuery中修复的错误还是它的一个特性?

我知道我可以通过使用$content.eq(i)而不是避开它,不过我很好奇,想知道这是否是设计或错误行为,什么推荐的方法是什么?我是否应该始终使用$content.eq(i)

回答

3

而是执行此操作:

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

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

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

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

若要查看其中的差异,请从fiddle中立即删除前面的var关键字,然后检查您的控制台。

+0

哦,是的,谢谢有道理,它总是基本的东西,让我:) – DanH 2012-08-09 13:04:17

+0

我不会说这是基本的东西,但很高兴我可以帮助。看看http://stackoverflow.com/questions/500431/javascript-variable-scope更好的理解。 – 2012-08-09 13:10:31