javascript - 如何在 javascript (jQuery) 中分配迭代数组的事件回调

标签 javascript jquery events iteration

我正在通过 javascript(使用 jQuery)生成一个无序列表。每个列表项都必须接收其自己的“点击”事件监听器。但是,我无法将正确的回调附加到正确的项目。一个(剥离的)代码示例可能会把事情搞清楚一点:

for(class_id in classes) {
    callback = function() { this.selectClass(class_id) };
    li_item = jQuery('<li></li>')
                .click(callback);
}

实际上,此迭代中进行了更多操作,但我认为它与问题的相关性不大。无论如何,正在发生的事情是回调函数似乎是引用 而不是存储(& 复制)。最终结果?当用户点击列表项中的任何时,它将始终执行 last class_id classes 的操作> 数组,因为它在特定点使用存储在 callback 中的函数。

我发现了变通方法(例如解析封闭的 a 元素中的 href 属性),但我想知道是否有办法在一个“干净”的方式。如果我的方法令人恐惧,请告诉我原因:-) 谢谢!

最佳答案

这是一个经典的“你需要一个闭包”问题。通常情况下是这样的。

  1. 迭代一些值
  2. 在使用迭代变量的迭代中定义/分配一个函数
  3. 您了解到每个函数仅使用上一次迭代的值。
  4. WTF?

同样,当您看到这种模式时,它应该会立即让您想到“闭包”

扩展你的例子,这里是你如何放入一个闭包

for ( class_id in classes )
{
  callback = function( cid )
  {
    return function()
    {
      $(this).selectClass( cid );
    }
  }( class_id );
  li_item = jQuery('<li></li>').click(callback);
}

但是,在这个特定的 jQuery 实例中,您不需要闭包 - 但我不得不问一下您的变量 classes 的性质 - 那是一个对象吗?因为您使用 for-in 循环进行迭代,这表明 object.对我来说,这引出了一个问题,你为什么不把它存储在一个数组中?因为如果你是,你的代码可能就是这样。

jQuery('<li></li>').click(function()
{
  $(this).addClass( classes.join( ' ' ) );
});

关于javascript - 如何在 javascript (jQuery) 中分配迭代数组的事件回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104321/

相关文章:

javascript - 尝试使用 giphy API 切换图像状态 - 从静止到动画

javascript - 无法在 Highcharts 中的 x 轴上显示日期

javascript - JQuery 动态添加回调

javascript - 动态创建的元素上的事件绑定(bind)?

javascript - 动态生成的下拉选项的 knockout 绑定(bind)

javascript - 如何使用 Ajax 调用 JavaScript 文件并使用该 JavaScript 文件中的逻辑

javascript - 从数组中仅删除一个重复项

javascript - 想要在页面加载时显示类似 YouTube 的进度条

java - HashMap在迭代过程中插入

javascript - 需要 Javascript 正则表达式来匹配 URL 中的语言参数