如何让chrome扩展热键与gmail,雅虎邮件等一起工作



我正在使用以下代码为我的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邮件或gmx撰写电子邮件外,它似乎无处不在。选择合成框时,热键不起作用。这让我很失望,因为我希望人们能用我的分机来帮助写电子邮件。推特,在推特上打字时也不起作用。

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

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

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

一个很长的方法可能是将JavaScript文件注入DOM,然后由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")

最新更新