我有很多div,我正在打开和关闭。我最初是手动绑定处理程序(根据下面的代码),但决定做一些重构。但是,出现了绑定问题,其中散列中的最后一个键/值是始终选择的那个。在示例代码中,这将是contact_data div。我认为问题是数据没有被关闭,但我不确定如何在JS中强制执行此操作。
var link_div = {
"#about_toggle" : "#about_stuff",
//more pairs
"#contact_toggle" : "#contact_data"
};
/*
* Before refactoring:
$("#about_toggle").click( function()
{
$("#about_stuff").toggle();
});
*/
//After
for(var key in link_div)
{
$(key).click(function()
{
alert(link_div[key]);
toggle_on_element(link_div[key]);
});
}
答案 0 :(得分:5)
实际上问题是,数据 被关闭。您在事件处理程序中传递的匿名函数将关闭您的循环变量,因此所有事件处理程序都引用相同的变量。您需要调用另一个函数来避免这种情况:
for(var key in link_div)
{
$(key).click(function(k)
{
return function() {
alert(link_div[k]);
toggle_on_element(link_div[key]);
}
}(key));
}
答案 1 :(得分:0)
所有关于闭包的东西都回到了语言的环境框架绑定模型。基本上是关键遍历你的循环,最后指向地图中的最后一个值(顺便说一下,可能不保证顺序,我不确定具体的实现)。因此,匿名函数(在所有元素之间共享,因为它被创建一次,因此在内存中引用一个环境框架)将为所有元素切换link_div [key],但是对于所有元素,key只有一个值。
你可以通过包装匿名函数使其对每个绑定都是唯一的(如jAndy所做的)来解决这个问题,或者使用命名约定来简化生活:
$('.togglers').click(function(){ $('#'+$(this).attr('id')+'_stuff').toggle(); });