Javascript 删除已存在的事件侦听器

Javascript 删除已存在的事件侦听器,javascript,jquery,event-listener,Javascript,Jquery,Event Listener,我正在尝试从对象中删除已存在的事件侦听器。我尝试过几种方法(使用jQuery.off(),.unbind(),标准RemoveEventListeners()),但正如文档中所述,它们只能删除以前添加的方法 使用Chrome调试器,我可以查看并删除指定的事件侦听器, 另外,当尝试通过jQuery\u data()函数列出事件侦听器时,它不会列出事件。我已经找了几个小时的答案了 有人能帮忙吗?有解决办法吗 编辑:我必须保留一些,因此无法进行克隆。如果事件处理程序是使用addEventListen

我正在尝试从对象中删除已存在的事件侦听器。我尝试过几种方法(使用jQuery
.off()
.unbind(),
标准
RemoveEventListeners()
),但正如文档中所述,它们只能删除以前添加的方法

使用Chrome调试器,我可以查看并删除指定的事件侦听器,

另外,当尝试通过
jQuery\u data()
函数列出事件侦听器时,它不会列出事件。我已经找了几个小时的答案了

有人能帮忙吗?有解决办法吗


编辑:我必须保留一些,因此无法进行克隆。

如果事件处理程序是使用
addEventListener
添加的,则除非有对添加的处理程序函数的引用,否则无法将其删除。我认为一定是这样的,因为如果它与jQuery(或各种快捷方式)连接起来,它就会工作,而您说过它不工作

解决这个问题的一种方法是用克隆替换元素。使用DOM克隆元素时,不会复制其事件处理程序。因此,如果从
元素开始,则可以克隆它,使用插入克隆,然后使用删除原始元素:

var newElement = element.cloneNode(true); // true = deep
element.parentNode.insertBefore(newElement, element);
element.parentNode.removeChild(element);
当然,这确实是一个解决办法。正确的做法是不首先设置处理程序,或者如果需要在以后删除它,则保留对它的引用


你在评论中说你不能这样做,并问:

有没有办法添加一个新的事件监听器来阻止已经存在的事件监听器

除非你能先到那里,否则不行

不能添加阻止现有处理程序的新处理程序(不是以跨浏览器的标准方式),但如果可以在添加另一个处理程序之前添加自己的处理程序,则可以使用以下方法防止调用该处理程序:

//您的处理程序
document.getElementById(“目标”).addEventListener(“单击”,函数(e){
log(“您的处理程序”);
e、 停止即时复制();
e、 停止传播();
});
//你想阻止的那个
document.getElementById(“目标”).addEventListener(“单击”,函数(e){
log(“您试图阻止的处理程序”);
});

单击我
一种非常简单的方法是使用.innerHTML不向父元素追加任何内容。请注意,这将销毁作为父元素的后代的所有事件侦听器。下面是一个示例(单击2以销毁附加到1的事件侦听器):

const d1=document.querySelector('#d1');
d1.addEventListener('click',()=>console.log(123));
const d2=document.querySelector(“#d2”);
d2.addEventListener('click',()=>d1.parentNode.innerHTML+='')
1

2
您能为如何删除它添加代码吗?谢谢您的回答。显然,我必须保留一些事件侦听器,因此这不是一个选项。我们不能访问我所描述的事件监听器有(安全)原因吗?我想我得设法解决我的问题。有没有办法添加一个新的事件侦听器来阻止已经存在的事件侦听器?@VanC-我已经更新了答案。不幸的是,除非你能先把你的处理器放进去,否则你不能阻止另一个。它比你的跑得早(它们按顺序跑)。谢谢你的努力!我保留了最初的活动,只是在上面放了一个,两个都被炒了没关系。最重要的是有一个学习的过程。谢谢你,但我必须保留一些活动的听众。我回答了T.J.Crowders关于更多信息的回答。