0

我在这个循环中调用增量器 i 来识别我当前的元素时遇到了一些麻烦。Firebug 给了我错误"li[i].addEventListener is not a function"

document.addEventListener("DOMContentLoaded", function(){

var li = document.getElementsByTagName('li');

for(var i in li){
    li[i].addEventListener('click', function(){
        alert('yey');
    });
    }
});

奇怪的是,如果我打电话

alert(li[i].getAttribute('id')

我收到了提醒我的 ID,但如果我随后使用

var id=li[i].getAttribute('id');
document.getElementById(id).addEventListener(blah);

我得到相同的“不是函数”错误。这是for循环吗?我注意到alert(i);在循环结束时调用了一些额外的东西,那么有没有不同的方法在 for in 循环中使用增量器?顺便说一下,我正在使用的列表是:

<ul>
    <li id=pomp>
        stuff
    </li>
    <li id=and>
        and
    </li>
    <li id=circumstance>
        things
    </li>
</ul>
4

3 回答 3

3

这就是为什么你必须避免使用for in循环

for(var i=0;i<li.length;i++){
    li[i].addEventListener('click', function(){
        alert('yey');
    });
}

当您使用 for in 时,i它不是您期望的整数,而是节点列表的属性。

于 2012-08-18T05:58:18.903 回答
0

正如@lbu 所指出的,您应该使用它for (decl; test; inc)来遍历数组。

然而,这也是使用委托的好地方,因为 each<li>必须是 a 的直接后代<ul>,您可以将事件处理程序放在那里,并减少浏览器的工作量:

var ul = document.getElementsByTagName('ul');

for (var i = 0, n = ul.length; i < n; ++i) {
    ul[i].addEventListener('click', function(ev) {
        alert(ev.target.id);
    });
}

http://jsfiddle.net/2mk3w/

于 2012-08-18T06:10:12.153 回答
-1

试试这个方法

for(var i in li){
    i.addEventListener('click', function(){
        alert('yey');
    });
    }
});
于 2012-08-18T06:02:28.580 回答