我正在编写一个浏览器扩展,需要将处理程序附加到所有页面上的keyup
和keydown
事件。我可以用下面的内容脚本代码让它工作得很好。
document.addEventListener("keydown",keyDown, true);
document.addEventListener("keyup", keyUp, true);
我不能让它在Gmail中工作。特别是我不能得到它的工作时,撰写一封新的电子邮件的主体。它会在我测试过的任何地方工作。我认为问题是因为Gmail在所有键盘事件上都调用stopPropagation
,但很难调试它们的最小化代码。我以为将第三个参数设置为true
会导致在CAPTURE_PHASE
期间捕获事件,但这不起作用。
如何在Gmail中使用Google Chrome内容脚本编写新正文时捕获keyup
和keydown
事件?
编辑:
我已经通过将"all_frames": true,
添加到我的清单中来确保我的内容脚本被注入到DOM的所有iframe中。我甚至尝试使用以下代码:
document.addEventListener("DOMNodeInserted", function (event) {
if(event.type === "DOMNodeInserted") {
if(event.srcElement.nodeName === "IFRAME") {
console.log(event.srcElement.nodeName + " iframe detected");
event.srcElement.addEventListener("keydown", function(kevent) {
document.dispatchEvent(kevent);
}, true);
event.srcElement.addEventListener("keyup", function(kevent) {
document.dispatchEvent(kevent);
}, true);
}
}
},true);
这仍然不能解决Gmail的问题。
2条答案
按热度按时间x759pob21#
您的代码无法工作,因为
event.srcElement
引用的是<iframe>
元素,而不是其内容。要访问其内容文档,必须等待加载框架(onload
或轮询),然后使用frame.contentDocument
访问框架。从Chrome 37.0.1995.0开始,您还可以使用
match_about_blank
(带有all_frames)在about:blank
帧中插入内容脚本,该脚本捕获事件并将其发送给父内容脚本。下面是原始想法的实现示例(使用轮询):
manifest.json
相关部分:contentscript.js
请注意,我使用轮询而不是DOM突变事件,因为后者**heavily reduces performance**。
8zzbczxx2#
这个可能会有帮助
how can I listen for keyboard events in gmail
DOM冒泡在窗口上启动,因此需要在那里附加侦听器,并指定第三个参数true来指示捕获阶段,这实际上是第一个事件阶段。- wOxxOm
根据你的代码,它可能是这样的: