使用GMail的Chrome扩展程序内容脚本中的键盘绑定

时间:2011-09-19 08:34:27

标签: javascript google-chrome-extension gmail

我正在创建一个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(...)是正确的方法。

谢谢!

1 个答案:

答案 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"]
    }
],