javascript - 在 for 循环中分配点击处理程序

标签 javascript jquery jquery-selectors closures

我有几个 div 的 #mydiv1#mydiv2#mydiv3,...并想为它们分配点击处理程序:

$(document).ready(function(){
  for(var i = 0; i < 20; i++) {
    $('#question' + i).click( function(){
      alert('you clicked ' + i);
    });
  }
});

但是当点击 #mydiv3 时,我没有显示 'you clicked 3'(对于其他所有点击),我得到的是 'you clicked 20'。我做错了什么?

最佳答案

创建 closures in loops 是一个常见的错误在Javascript中。您需要像这样的某种回调函数:

function createCallback( i ){
  return function(){
    alert('you clicked' + i);
  }
}

$(document).ready(function(){
  for(var i = 0; i < 20; i++) {
    $('#question' + i).click( createCallback( i ) );
  }
});

2016 年 6 月 3 日更新:由于这个问题仍然受到一些关注并且 ES6 也越来越流行,我建议采用现代解决方案。如果你编写 ES6,你可以使用 let 关键字,这使得 i 变量在循环中是局部的,而不是全局的:

for(let i = 0; i < 20; i++) {
  $('#question' + i).click( function(){
    alert('you clicked ' + i);
  });
}

它更短且更容易理解。

关于javascript - 在 for 循环中分配点击处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4091765/

相关文章:

javascript - 在 React js 中打开和关闭递归嵌套列表

javascript - 如何使用 .NET (C#) 或 JavaScript 获取 .MP4 播放长度?

Jquery 获取 this 或 $(this) 内的所有...

javascript - jQuery 选择器仅第一级 div

jquery - 如何更改选择列表项的背景图像?

javascript - 如何从 jQuery 对象中获取选择器

javascript - 在 Javascript 书签中动态生成整个页面

jquery - 获取当前div之后的div元素的个数

javascript - 该按钮不是通过 TEXT 方法中的变量添加的

javascript - jQuery 不依赖于另一个控件的值