0

我正在使用以下代码为我的 Chrome 扩展程序实现热键:

// content script:
  window.addEventListener("keydown", function(event) {
      if (event.ctrlKey && event.keyCode == 81) {alert('Ctrl+Q Pressed!');}
    }, false);

由于在清单文件中插入以下行,它在大多数情况下都有效,即使选择了 iFrame:

...
  "content_scripts": [
    {
      "all_frames": true
...

例如,使用http://danish.typeit.org时,热键现在甚至在使用该热键和 facebook 个人消息时也可以使用。除了使用 gmail、yahoo mail 或 gmx 撰写电子邮件时,它似乎无处不在。选择合成框时,热键不起作用。这令人失望,因为我希望人们会使用我的扩展程序来帮助编写电子邮件。而 Twitter,在 Twitter 上打字时也不起作用。

4

1 回答 1

0

我认为即使您all_frames指定了内容脚本也没有为编辑器 iframe 加载的原因是内容脚本仅应用于加载包含页面时标记中存在的 iframe。

在 gmail 页面的情况下,页面上有多个 iframe,其中一些出现在包含页面的标记中(内容脚本被应用到),然后是编辑器的一个,它是由 JavaScript 之后创建的页面已加载。

即使您尝试等待页面上的 JavaScript 为编辑器加载 iframe,内容脚本中的 JavaScript 也无法访问它,因为在内容脚本中不允许访问 iframe 的 contentWindow 对象。

一个长镜头可能是将 JavaScript 文件注入到 DOM 中,然后执行您在内容脚本中的逻辑。

内容脚本可能类似于:

document.body.appendChild(document.createElement("script")).src = "http://external/file/javascript.js";

然后远程 JavaScript 文件的内容可以尝试访问编辑器 iframe,您可能需要使用 setInterval 直到创建元素。

// These are the IDs gmail uses, each mail app would be different
document.getElementById("canvas_frame").contentWindow.document.getElementById(":nt")
于 2012-01-15T03:38:56.337 回答