为什么来自循环的警报总是返回最后一个值,而不是每个迭代值
Why does the alert coming from my loop always return the last value, not each iteration value?
我有一些按钮,它们存储在一个数组中。然后,我循环遍历该数组,为每个按钮添加一个单击事件。每次单击都会提醒i
的值。我希望这些值是1
、2
、3
等等,但在3
的情况下,它们总是作为一个值返回。
你能解释一下为什么会发生这种情况以及如何解决吗?
请参阅一个jsFiddle。以下代码:
var theButtons = ['.button.one', '.button.two', '.button.three'];
for (i=0; i<theButtons.length; i++) {
$(theButtons[i]).click(function () {
alert(i); // always returns 3
});
}
请尽可能简单明了地解释它——我在Javascript和编程方面有点初学者
单击按钮i === 3
时。需要将i
的值传递到闭包中:
for (var i = 0; i<theButtons.length; i++) { // do `var i` so the i is not global
(function(index){
$(theButtons[i]).on('click', function () {
alert(index); // index === the value that was passed
});
})(i); // pass the value of i
}
Fiddle演示:http://jsfiddle.net/maniator/fE55Y/3/
只需使用EACH方法:
$( ".button" ).each(function( index ) {
$(this).click( function(e){
alert( index + ": " + $(this).text());
});
});
Fiddle:http://jsfiddle.net/fE55Y/4/
更新:
同意所要求的内容不需要.each()
。这是一个没有使用.each()
方法的。
$(".button").click(function () {
alert("Button Index: " + $(this).index());
});
欢迎使用异步编程和全局变量!
您在这里看到的问题是,在这种情况下,i
是全局声明的,任何东西都可以从任何地方访问。
所以,当你的脚本被执行时会发生什么:
- 循环遍历类名数组
- 在每次迭代中,将一次单击绑定到匹配的节点,调用您提供的匿名函数
这里的问题是,您提供的函数是在循环之外执行的(例如,当单击发生时),因此i
的值是上次迭代中的值,在本例中是2
相关文章:
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- Rails:试图在javascript(Google Charts API)中嵌入一个adv-ruby(each+迭代器
- 我可以按特定的顺序迭代一个标签中的不同数据标签吗
- 我需要迭代一个JSON数组——不知道如何做到——已经搜索过了,但仍然可以'我一点也不知道
- 在每个循环中的给定迭代中,在Handlebarsjs中推送一个html标记
- 更改一个ng重复上的单个迭代
- 创建一个生成器来迭代对象属性排列
- 异步mongodb更新循环中最后一次迭代后的重定向
- 只有最后一个文件是通过迭代形式.submit()操作下载的
- 在迭代中仅启用一个提交按钮
- 如何在数据数组的每次迭代中创建一个内容为“i+1”的新 HTML 元素
- 获取
- 但仅查找选定的内容,然后迭代下一个
- 依此类推
- 为什么来自循环的警报总是返回最后一个值,而不是每个迭代值
- 迭代Json并获取最后一个元素
- 仅当最后一个 AJAX 请求在 JavaScript 中完成时,才输入 next 进行迭代
- 循环迭代上一个下一个
- 当使用Javascript迭代JSON时…返回的最后一个键是"remove"
- Javascript对象循环只是将最后迭代的元素追加到另一个对象
- 检查当前迭代的元素是否是最后一个元素