【发布时间】:2014-02-24 13:37:42
【问题描述】:
我想为我的所有标签添加一个事件侦听器,每个标签都传递一个对自身的引用当触发事件时作为参数。这是我写的函数:
function validateDigitsFeature()
{
// Add the event listeners to input tags
// Get the array of input tags
var inputTags = document.getElementsByClassName('validateInput');
var tagId;
// Loop through them, adding the onkeypress event listener to each one
for (var i = 0; i < inputTags.length; i++)
{
// Give each input element an id
tagId = inputTags[i].id = 'input_id_' + i;
inputTags[i].addEventListener('keyup', function(){isNumberOrDot(event, tagId);}, false);
}
}
该函数基本上应该做以下事情:
- 将具有指定类名的所有输入标签存储在一个数组中
- 循环遍历数组,为每个标签添加一个 id 和
- 使用
isNumberOrDot(event, tagId)处理程序添加onkeyup事件侦听器。
问题
添加了 onkeyup 事件,但每个事件的处理程序总是引用数组最后一个元素的tagId。
问题
代码/逻辑有什么问题?又该如何解决?
注意
当然,这个问题与循环中的 JavaScript 闭包有关,虽然这个问题可能有更一般的答案,但它特定于正在使用的事件侦听器。对于更高级的开发人员,可能很容易将通用解决方案应用于此问题。但对我来说,其他解决方案仍然没有提供完整的解释,甚至没有奏效。
提前谢谢你。
【问题讨论】:
-
这是因为您正在处理关闭问题。
-
这个问题已经被问了十亿次。如果要在回调中访问,您需要在闭包中为每个循环迭代绑定变量的值。
-
感谢您为我指明了正确的方向。我不知道使用哪些关键词来找到解决方案。得到答案后,我会正确地将我的问题标记为重复。
-
@andrew 这不是很精确。事件处理程序已经是一个闭包。解决方案是通过执行一个函数来创建一个新的作用域(这是否涉及另一个闭包并不重要)。
标签: javascript arrays dom for-loop