我可以在html元素上以编程方式检查和修改Javascript事件处理程序吗?

时间:2009-09-17 05:22:36

标签: javascript events browser

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

3 个答案:

答案 0 :(得分:3)

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

el.parentNode.replaceChild(el.cloneNode(true), el);

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

parentNode

请注意,这不仅会删除元素的事件侦听器,还会删除所有元素兄弟的侦听器。

或者,您可以通过重新分配元素的el.parentNode.innerHTML = el.parentNode.innerHTML; 解决IE问题:

outerHTML

答案 1 :(得分:1)

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

如果使用addEventListener或其中一个专有的addWhatever侦听器方法附加它们,则无法列出它们。

如果通过修改事件属性来附加它们,即。 node.onclick = whatever,那么你可以读取属性的值来获取函数,它的工作方式与任何其他JS函数相同。

还有第三种方式:

如果您自动执行的代码使用这些代码,则可以覆盖默认的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);
}

答案 2 :(得分:0)

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

有关详细信息,请参阅此链接:

http://www.howtocreate.co.uk/tutorials/javascript/domevents