我能否以编程方式检查和修改html元素上的Javascript事件处理程序?

我能否以编程方式检查和修改html元素上的Javascript事件处理程序?,javascript,events,browser,Javascript,Events,Browser,我正在使用C#实现浏览器自动化,我想修改或可能只是删除我正在查看的网页中某些html元素上的事件处理程序。例如,假设有一个按钮可能(或可能没有)有一个附加的onClick事件。我该怎么做: -找出是否有任何事件处理程序附加到onClick上? -删除它们?据我所知,目前无法使用javascript将所有事件处理程序附加到一个元素 有关更多信息,请参阅此链接: 这取决于事件处理程序如何附加到元素 如果它们是使用addEventListener或某个专有的AddWhather listener方法附

我正在使用C#实现浏览器自动化,我想修改或可能只是删除我正在查看的网页中某些html元素上的事件处理程序。例如,假设有一个按钮可能(或可能没有)有一个附加的onClick事件。我该怎么做: -找出是否有任何事件处理程序附加到onClick上?
-删除它们?

据我所知,目前无法使用javascript将所有事件处理程序附加到一个元素

有关更多信息,请参阅此链接:


这取决于事件处理程序如何附加到元素

如果它们是使用addEventListener或某个专有的AddWhather listener方法附加的,则无法列出它们

如果它们是通过修改event属性(即node.onclick=which)附加的,那么您可以读取属性的值来获取函数,它的工作方式与任何其他JS func相同

还有第三种方法:

如果自动执行的代码使用默认的addEventHandler/addListener行为,则可以重写这些行为。通过这样做,您可以将默认行为替换为将每个处理程序推送到一个数组中的行为,然后您可以自己循环

以下代码可能会起作用:

var oldAddEventListener = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function(event, handler, bubbling) {
    /* do whatever you want with event parameters */

    oldAddEventListener.call(this, event, handler, bubbling);
}

用它自己的克隆替换元素应该有效地丢弃它的所有事件侦听器(从技术上讲,侦听器仍然在元素上,但由于元素被替换为它自己的克隆,看起来就像侦听器被删除了一样):

不幸的是,这在IE中不起作用,因为IE错误地传输克隆上元素的事件侦听器。要解决此问题,您可以重新分配元素的
父节点的
innerHTML

el.parentNode.innerHTML = el.parentNode.innerHTML;
请注意,这不仅会删除元素的事件侦听器,还会删除元素的所有同级的侦听器

或者,您可以通过重新分配元素的
outerHTML
来解决IE问题:

el.outerHTML = el.outerHTML;

据我所知,addEventListener适用于某些浏览器,如果您能为其他浏览器扩展您的解决方案,那将非常好。这种方法适用于符合标准的浏览器,如Firefox、Opera,可能还有基于Webkit的浏览器。Internet Explorer不支持HTMLElement.prototype,因此,在其中执行同样的操作有点棘手。您可能会在文档中的每个节点上循环并替换addListener或类似的内容。这是否是一个好主意取决于您正在编写的代码类型。如果代码不需要,也永远不需要,与其他代码友好相处,那么它就没有那么重要了。此外,对于更专业的Purprose(比如这里的Purprose),没有那么多的方法。@Jani,这实际上与第三方代码无关。这是关于代码运行的环境。事实上,扩展宿主对象本质上是一个坏主意,因为宿主对象的行为不可预测(但完全符合标准)。在受控环境中扩展它们可能没什么问题,但在一般的web环境中,它实际上是在攻击你自己。@JaniHartikainen在控制台上运行时效果非常好,但当它是内容脚本(Firefox 85)的一部分时就不行了。我知道内容脚本不能访问所有的web扩展API,但顺便说一句,
addEventListener
是DOM API的一部分,内容脚本应该能够使用它。因此,我希望它也能在内容脚本中工作。我错过什么了吗?哇,我不知道那个IE bug。真让人痛苦!请参见相关:另请参见:否,不能通过为事件指定null来删除所有事件处理程序。例如,使用
addEventListener
/
attachEvent
添加的事件不受影响。
el.outerHTML = el.outerHTML;