绑定jQuery点击事件通过循环哈希抓取哈希中的最后一个元素?

时间:2011-01-16 00:11:30

标签: javascript jquery

我有很多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]);
             });
    }

2 个答案:

答案 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(); });