2012-08-03 78 views
1

我试图让我的页面幻灯片滚动,当我点击Javascript/jQuery中的链接,但我无法弄清楚如何传递当前增量值我的for循环作为参数,在for中绑定了我的链接上的点击事件。当我点击,它会调用我定义的功能,但与我的我的当前值,而不是被定义的函数时,它的值是...这里是我的一些代码:作为Javascript中的内联函数中的值传递参数

temp[0] = 0; 
for(var i=1;i<8;i++) 
{ 
    temp[i] = defaultPositions["slide"+i].top; 
    console.log(defaultPositions["slide"+i].top); 
    $('a.slide'+i).bind('click', function() { 
    $('html, body').animate({scrollTop:(defaultPositions['slide'+i].top/slidesScrollSpeed)}, 1000, function() { 
      parallaxScroll(); 
     }); 
     return false; 
    }); 
} 

你知道我怎么能通过我的价值,所以当我点击一个链接,每个链接都有很好的价值,而不是所有的slide8?

回答

4

摘要:

for (var i=1;i<8;++i){ 
    (function(i){ 
    // Your code using `i` in callbacks here 
    })(i); 
} 

你的问题是,有你所有的瓶盖(为click处理程序创建的匿名函数之间被共享的单一变量i,所有的“接近结束”的i公布值在函数外部),所以当该循环中该变量的值增加时,所有函数仍然引用相同的更新值。

通过包装你的循环体在获取的i值传递的函数,你会得到一个新的,独特的可变i每次迭代的功能关闭了。为了更清楚是怎么回事,你能或者写为:

for (var i=1;i<8;++i){ 
    (function(slideNum){ 
    // Your code using `slideNum` in callbacks here 
    })(i); 
} 

或者,你可以只为封创建一个自定义变量,像这样:

for (var i=1;i<8;i++){ 
    var slideNum = 'slide'+i; // Create a new variable to use in the closure 
    temp[i] = defaultPositions[slideNum].top; 
    $('a.slide'+i).bind('click', function() { 
    $('html, body').animate({ 
     scrollTop:(defaultPositions[slideNum].top/slidesScrollSpeed) 
    }, 1000, function() { parallaxScroll(); }); 
    return false; 
    }); 
} 

另外,还要注意这取决于parallaxScroll() —实施—你很可能简化行只是:

$('html, body').animate({ 
    scrollTop:(defaultPositions[slideNum].top/slidesScrollSpeed) 
}, 1000, parallaxScroll); 
+0

这是一个完美的答案!它不仅工作,而且现在我明白什么不起作用,并且_why_。非常感谢你! – 2012-08-03 19:15:06

+0

@ sam_1421很高兴帮助:) – Phrogz 2012-08-03 20:42:50

相关问题