这个问题基本上是我所问的,但有不删除后代节点事件的限制。
在这个fiddle中,我试图通过将它从DOM中删除并重新放置来移除附加的监听器。
function removeListeners(el) {
var par = el.parentNode;
var place = el.nextSibling;
par.removeChild(el);
par.insertBefore(el, place);
}
很遗憾这个方法没有起作用,但你仍然可以点击来改变背景(这其实很好,我之前不知道可以在元素不在DOM中的情况下附加事件)。
鉴于这一发现,我尝试了this。
function removeListeners(el) {
var par = el.parentNode;
var clone = el.cloneNode(false);
par.replaceChild(clone, el);
for (var index = 0; index < el.childNodes.length; ++index)
clone.appendChild(el.childNodes[index]);
}
这里尝试进行浅拷贝,然后将所有子项复制回来,但并没有复制所有的子元素。
前面提到的问题的答案说:“[如果您希望子项保留其侦听器],则必须显式地逐个删除侦听器。”我不知道您将如何实现。
我猜他的意思是获取事件类型列表,然后逐个删除每个事件类型的侦听器(就像 jQuery 一样)。这不仅对于自定义事件是不可能的,而且原生 JS 没有这样的功能(必须指定要删除的函数)。