2

为了记录 Selenium 脚本,我需要能够拦截页面上的所有事件,例如 keyup 或 click。目前,我通过将事件侦听器附加到页面上的所有元素来做到这一点,但如果已经存在阻止事件冒泡的侦听器,它永远不会到达我。

我尝试了https://stackoverflow.com/a/6434924/15255调试时或从 JavaScript 代码中如何在 DOM 节点上查找事件侦听器中的“替换 addEventListener”方法?,但这似乎不起作用。

这一切都在一个 Firefox 插件中,所以我可以做一些特权的事情,但似乎没有太多功能可以枚举或修改现有的侦听器。有人对如何做到这一点有建议吗?

编辑:目前的代码:

jQuery(frame.document).
        bind("dblclick", {}, this.listeners.writeJsonClicks, true).
        bind("keyup", {}, this.listeners.writeJsonChange, true).
        bind("change", {}, this.listeners.writeJsonChange, true);

澄清一下:我无法控制 frame.document 中文档的内容。这是用户记录脚本的任何页面。问题是,当文档加载时,它自己的捕获已经安装,所以我的不会收到事件。

当页面 DOM 已完全加载但附加侦听器的 JS 尚未执行时,我一直试图在页面加载时捕获页面。使用NsIObserverService进行侦听document-element-inserted看起来很有希望,但是只要有任何 DOM,就会发生该事件:文档及其头部已加载,但正文未加载。

从根本上说,我需要一种方法来重新排序现有的侦听器以在之前的侦听器之前插入我的侦听器,一种能够在加载 DOM 树但 JS 尚未运行时运行代码的方法,或者一种方法拦截对 addEventListener 的调用以包装添加的侦听器,让我窃听。

4

1 回答 1

2

您应该注册一个捕获侦听器 - 无法阻止事件被捕获。

document.addEventListener("keyup", function(event)
{
  console.log("keyup event received on " + event.target);
}, true);
于 2012-06-28T18:37:52.503 回答