从插件中拦截Firefox中的keyup事件

时间:2012-06-28 14:37:51

标签: javascript events firefox firefox-addon

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

我在https://stackoverflow.com/a/6434924/15255中尝试了How to find event listeners on a DOM node when debugging or from the JavaScript code?中的“替换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的调用以包装添加的侦听器的方法,让我偷听。

1 个答案:

答案 0 :(得分:2)

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

document.addEventListener("keyup", function(event)
{
  console.log("keyup event received on " + event.target);
}, true);