因为实际事件发生在您之后的某个时间for
循环已经完成运行,因此它的索引位于最后一个值和函数中的任何局部变量,例如tagId
也处于其最后的值。您需要创建某种类型的闭包来保留i
or tagId
每个事件处理程序都是唯一的,因此它们每个都可以访问自己的值。
有几种不同的方法可以做到这一点,但所有方法都涉及通过i
每个事件处理程序的函数值。
下面是使用 IIFE(立即调用函数表达式)的一个:
function validateDigitsFeature()
{
// Add the event listeners to input tags
// Get the array of input tags
var inputTags = document.getElementsByClassName('validateInput');
// 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
(function() {
// creates a unique function context for each event handler so the
// value of tagId is unique for each event handler
var tagId = inputTags[i].id = 'input_id_' + i;
inputTags[i].addEventListener('keyup', function(){isNumberOrDot(event, tagId);}, false);
})();
}
}
更常见的方法是从for
循环进入闭包并在事件处理程序中基于它进行任何计算(尽管两种方法都可以正常工作),如下所示:
function validateDigitsFeature()
{
// Add the event listeners to input tags
// Get the array of input tags
var inputTags = document.getElementsByClassName('validateInput');
// 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
(function(index) {
// passes the `for` loop index into a function closure
// so it is uniquely preserved for each event handler
inputTags[index].addEventListener('keyup', function(){
isNumberOrDot(event, inputTags[index].id = 'input_id_' + index);
}, false);
})(i);
}
}