我正在创建一个Chrome扩展程序,它通过内容脚本使用键绑定(即将使用javascript keydown和keyup事件处理程序)。不过,我试图让它与GMail一起工作时遇到了障碍。
以下代码(内容脚本)中的处理函数似乎只有在我通过GChat与某人聊天时才会触发:
$(window).bind('keydown', function(e){console.log('yay!');});
不幸的是,它似乎没有在其他地方激活,包括当我尝试发送电子邮件时。我查看了GMail网页来源,结果发现实际显示的所有内容都位于ID为canvas_frame
的iFrame中,所以我尝试了这个:
$('#canvas_frame').content().live('keydown', function(e){console.log('yay!');});
和此:
$('#canvas_frame').content().find('body').live('keydown', function(e){
console.log('yay!');
});
不幸的是,这也不起作用。
我的manifest.json
看起来像这样:
{
"name": "extension",
"version": "1.0",
"description": "description",
"background_page": "background.html",
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"css": [],
"js": [
"main.js"
]
}
],
"all_frames": true,
"permissions": [
"http://*/*", "https://*/*"
]
}
我想知道是否有人知道发生了什么事,用GMail做这件事的正确方法是什么,如果$('#canvas_frame').content().live(...)
是正确的方法。
谢谢!
答案 0 :(得分:3)
您的all_frames
参数在清单中放错了地方,应该是:
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"all_frames": true,
"js": ["main.js"]
}
],
我会通过将内容脚本注入iframe本身并在那里执行所有键绑定来解决此问题。确定这些iframe的URL并将各个内容脚本注入其中。例如:
"content_scripts": [
{
"matches": ["http://gmail.com/*"],
"all_frames": false,
"js": ["main.js"]
},
{
"matches": ["http://gmail.com/iframe1.html"],
"all_frames": true,
"js": ["iframe1.js"]
},
{
"matches": ["http://gmail.com/iframe2.html"],
"all_frames": true,
"js": ["iframe2.js"]
}
],