【发布时间】:2009-09-17 05:22:35
【问题描述】:
我正在使用 C# 进行浏览器自动化,我想修改或可能只是消除我正在查看的网页中某些 html 元素上的事件处理程序。例如,假设那里有一个按钮,它可能(或可能没有)附加 onClick 事件。我该怎么做: - 找出是否有任何事件处理程序附加到 onClick? - 删除它们?
【问题讨论】:
标签: javascript events browser
我正在使用 C# 进行浏览器自动化,我想修改或可能只是消除我正在查看的网页中某些 html 元素上的事件处理程序。例如,假设那里有一个按钮,它可能(或可能没有)附加 onClick 事件。我该怎么做: - 找出是否有任何事件处理程序附加到 onClick? - 删除它们?
【问题讨论】:
标签: javascript events browser
用它自己的克隆替换元素应该有效地丢弃它的所有事件监听器(好吧,从技术上讲,监听器仍然在一个元素上,但是由于一个元素被它自己的克隆替换,它看起来好像侦听器被简单地删除):
el.parentNode.replaceChild(el.cloneNode(true), el);
不幸的是,这在 IE 中不起作用,因为 IE 在克隆时错误地传输元素的事件侦听器。要解决这个问题,您可以重新分配元素的 innerHTML 的 parentNode:
el.parentNode.innerHTML = el.parentNode.innerHTML;
请注意,这不仅会删除元素的事件监听器,还会删除元素所有兄弟姐妹的监听器。
或者,您可以通过重新分配元素的outerHTML 来解决 IE 问题:
el.outerHTML = el.outerHTML;
【讨论】:
这取决于事件处理程序是如何附加到元素的。
如果它们是使用 addEventListener 或专有的 addWhatever 侦听器方法之一附加的,则无法列出它们。
如果它们是通过修改事件属性附加的,即。 node.onclick = 不管,然后你可以读取属性的值来获取函数,它会像任何其他 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);
}
【讨论】:
addEventListener 是内容脚本应该能够使用的 DOM API 的一部分。因此,我希望它也可以在内容脚本中工作。我错过了什么吗?
据我所知,目前无法使用 javascript 来获取附加到元素的所有事件处理程序。
查看此链接了解更多信息:
【讨论】:
addEventListener/attachEvent 添加的事件不受影响。