2

例如,如果我有一系列这样创建的事件侦听器:

var els = document.getElementyById('myList').getElementsByTagName('li');
for (i=0;i<els.length;i++) {
    els[i].addEventListener(eventType, function(e){ /* do stuff */ }, true);
}

首先,我是否犯了这样的异端邪说?<li>我的意思是,除了每个元素的事件之外,还有更简单的方法吗?

无论哪种情况,主要问题是:如果<li>s 被删除/替换,这些事件侦听器会发生什么?如果我这样做会发生什么:

document.getElementyById('myList').innerHTML = 'Hello World!';

听众是否保持“暂停”状态从而减慢浏览器速度(假设我有很多s<li>),还是自动删除?这甚至是一个问题吗?

4

1 回答 1

7

分配给被破坏元素的事件处理程序被标记为垃圾收集。这意味着它们已从内存中删除。此外,如果您的每个事件都做同样的事情,请将它们绑定到包含的<ul>点击事件将从lis 冒泡到ul.

还,

<li>“除了每个元素的事件之外,还有更简单的方法吗?”

在这里使用附加到包含 ul 元素的委托处理程序是有意义的。不一定更简单,但只是稍微复杂和更有效 - 或者如果您动态添加 li 元素,它可能更简单。它完全避免了您担心的问题。

(@nnnnnn 提供)

将评论转换为答案,因为它似乎有助于回答问题。

于 2013-07-10T16:25:30.290 回答