【问题标题】:removeEventListener without knowing the functionremoveEventListener 不知道函数
【发布时间】:2015-01-06 20:37:16
【问题描述】:

某些第三方插件会将eventListener 附加到站点中。如何在不知道附加功能的情况下删除 eventListener。

我参考了这个removeEventListener,但我找不到任何删除它的线索。

例如:getEventListeners(window) 显示附加的事件。但是,当我尝试使用 window.removeEventListener("eventname") 删除事件时,在不知道该功能的情况下无法正常工作。

请帮忙,在此先感谢。

【问题讨论】:

    标签: javascript jquery event-listener


    【解决方案1】:

    getEventListeners(window) 将返回事件映射及其注册的事件侦听器。

    所以对于DOMContentLoaded 事件,例如你可以有很多事件监听器。如果您知道要删除的侦听器的索引(或者只有一个),您可以这样做:

    var eventlistener = getEventListeners(window)["DOMContentLoaded"][index];
    window.removeEventListener("DOMContentLoaded", 
                               eventlistener.listener,
                               eventlistener.useCapture);
    

    【讨论】:

    • 更方便,因为它还返回注销函数remove:getEventListeners(window).DOMContentLoaded[0].remove()
    • @dfsq, chrome 是,但不是 firefox。 (无法测试 ie)。
    • @Dieshkani 这不是在每个浏览器中都实现的,也不是规范的一部分。这不应该是公认的答案,除非您的问题仅针对 Chrome。在这种情况下,应该在问题中说明。
    • @plalx 是的,我知道。我一定会找到所有浏览器的答案。我接受了这个答案,因为它提供了一些线索。
    • @Dineshkani 好吧,这让所有其他会看这个问题的人感到困惑。 jAndy 已经在下面给出了正确答案。
    【解决方案2】:

    很遗憾,您不能这样做。您需要拥有对事件处理函数的引用,以便removeEventListener 将其删除。

    如果您无法获得该参考,您唯一的选择是完全替换该Node

    【讨论】:

    • jAndy 有没有办法通过 jquery 或 javascript 获取该引用。因为该事件是由第三方添加的,并且该事件附加在窗口元素中
    • @Dineshkani AFAIK 没有(但如果我错了,希望一些忍者会在这里纠正我)。通过 addEventListener 本地添加的事件不会存储在 Javascript 可访问的任何地方。
    • 感谢您的回复@jAndy
    • @Dieshkani 你能解释一下你为什么要这样做吗?如果第三方代码添加了监听器,那是因为它可能需要它才能正常工作......
    • 实际上getEventListeners 是可能的,因为它拥有事件监听函数。
    猜你喜欢
    • 2016-10-09
    • 2015-11-06
    • 2011-07-19
    • 2013-01-31
    • 1970-01-01
    • 2015-09-11
    • 2011-06-24
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多