我正在使用while循环在元素中附加事件。但是事件成功添加但该函数也在控制台上抛出错误。如果我使用预增量,那么它的工作正常。我只是想知道后增量有什么问题。 fiddle
var elements= document.getElementsByTagName('*'), i;
i=0;
while(elements[i++]){
if(elements[i].className=='c') {
elements[i].addEventListener('click',function() {
alert(this.className)
})
}
}
答案 0 :(得分:5)
循环标题中的i++
表示i
的值比测试时更强。您将跳过元素0并尝试处理超出列表末尾的元素。
所以当它运行时:
while (elements[i++])
测试的元素索引将通过最后一个元素为0,该点之后的i
值将是一个。这是因为i++
表示“使用i
的值,但之后会增加它。”
当您使用预增量(++i
)时,仍然错误,除非您将i
初始化为-1
。
这就是为什么我们有for
循环:
for (i = 0; elements[i]; i++) {
// ...
}
这样,i
的值在循环测试到循环体结束时保持不变。
答案 1 :(得分:3)
试试这个
var elements = document.getElementsByTagName('*'),
i = 0;
while (elements[i]) {
if (elements[i].className == 'c') {
elements[i].addEventListener('click', function (e) {
alert(this.className)
})
}
i++;
}
答案 2 :(得分:1)
请勿使用++
运算符。您应该使用聚合操作。它们是一个有用的反对循环的抽象层。它们允许您考虑迭代,而不用担心像增量这样的副作用操作的复杂性。
var elements = document.getElementsByTagName('*');
function toArray(list) {
return Array.prototype.slice.call(list);
}
toArray(elements).forEach(function (element) {
if (element.className === 'c') {
element.addEventListener('click', function () {
alert(this.className);
});
}
});