Gmail似乎捕获了所有键盘事件。有什么方法可以绕过那个?

时间:2010-02-24 05:44:48

标签: javascript javascript-events google-chrome gmail google-chrome-extension

我正在编写一个Chrome扩展程序,用于启动带有键盘快捷键的脚本。它在大多数页面上运行良好,但我意识到在Gmail上它没有:似乎所有键盘事件都是由Gmail捕获的,并没有冒泡到我的功能。

我有一个内容脚本(在Chrome扩展程序中,这是添加到您想要的任何页面)(当然简化):

document.body.addEventListener('keypress', myFunction, true);
function myFunction(event) {
    console.log("yay, Gmail didn't let me down!");
}

但实际上,Gmail确实让我失望了。我知道脚本加载。我尝试了window.addEventListener和其他事件类型的不同变体无济于事。

有人知道绕过这个的方法吗? 我试着看看GreaseMonkey脚本是否可以做到这一点,这让我来到这里:http://code.google.com/p/gmail-greasemonkey/但这对我没有帮助。

谢谢!

3 个答案:

答案 0 :(得分:1)

我不知道GMail键盘事件捕获的内部工作原理,但我最近为Chrome编写了一个简单的键盘快捷键导航器(因此我不必使用鼠标点击链接)。

它不是扩展名,而是用户/ Greasemonkey脚本,但它是通过键入逗号(,)两次触发,并且在GMail中有效。

也许它会帮助你查看来源。您可以在此处下载:http://userscripts.org/scripts/show/68609

答案 1 :(得分:1)

好的,我有一个可行的解决方案,从onePassword插件反向设计。我只能猜测为什么会这样,我认为这是因为将事件添加到输入元素。然而,改变任何东西,它停止工作(由于一个原因,底部的redir呼叫在底部)

function redir(e) {
    e.focus();
    var h = document.createEvent("KeyboardEvent");
    h.initKeyboardEvent('keydown', true, true);
    e.dispatchEvent(h)
}
$("input").each(function(t,l) {redir(l)});

document.addEventListener('keydown', function(e) {
    if (e.ctrlKey && e.keyCode) {
      if (e.keyCode == 190) {
        chrome.extension.sendRequest({name: "spot-openPopUp"});
      }
    }
},false);

redir(document.body);

正如您所看到的,我使用了重定向。这个例子真的很粗,所以不要只使用它

答案 2 :(得分:0)

您可以尝试重定向过程:

if (document.body.onkeypress) {
    // add as event listener instead
    var kpfunc = document.body.onkeypress;
    document.body.addEventListener('keypress', kpfunc, true);
}