【问题标题】:Intercepting keyup events in Firefox from an addon从插件拦截 Firefox 中的 keyup 事件
【发布时间】:2012-06-28 14:37:50
【问题描述】:

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

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

【问题讨论】:

  • 您能否包含您拥有的不起作用或不太正确的代码?

标签: javascript events firefox firefox-addon


【解决方案1】:

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

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

【讨论】:

  • 问题是我到的时候文档已经加载了,所以我不能先进去注册我的监听器。
  • 也许我误解了你的意思,但是你可以随时注册一个捕获事件监听器,只需将第三个参数设置为addEventListener。无论如何,捕获事件侦听器将始终接收所有事件。
  • 有趣。根据我的经验,这似乎不会发生。我遇到问题的特定页面是 voyages-sncf.com,我无法将 keyup 侦听器附加到“Départ”字段。
  • 实际上:您建议的代码有效。似乎问题源于我使用 jQuery 附加侦听器。
  • jQuery 模拟 DOM 事件以在所有浏览器(主要是 MSIE)上提供一致的体验,恕我直言,它正在造成比开始时更大的混乱。
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2021-06-27
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多