我正在使用以下代码为我的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")