开发者

Gmail seems to capture all keyboard events. Any way to go around that?

开发者 https://www.devze.com 2022-12-20 21:55 出处:网络
I\'m writing a Chrome extension that launches a script with a keyboard shortcut. It works fine on most pages but I realized that on Gmail it doesn\'t: it seems that all keyboard events are captured by

I'm writing a Chrome extension that launches a script with a keyboard shortcut. It works fine on most pages but I realized that on Gmail it doesn't: it seems that all keyboard events are captured by Gmail and are not bubbled up to my function.

I have a content script (in Chrome extension this is added to any page you want) that has (simplified of course):

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

But actually, Gmail does let me down. I know that the script is loaded. I tried different variations of window.addEventListener and other event types to no avail.

Does anybody know of a way to bypass this? I tried to see if GreaseMonkey script could do it, that brought me here: http://code.开发者_运维问答google.com/p/gmail-greasemonkey/ but that didn't help me.


I don't know the inner workings of GMail's keyboard event capturing, but I recently wrote a simple keyboard shortcut navigator (so I don't have to use the mouse to click links) for Chrome.

It's not an extension, but a user/Greasemonkey script, but it's triggered by typing comma (,) twice, and it works in GMail.

Maybe it'll help you to look at the source. You can download it here: http://userscripts.org/scripts/show/68609


Okay I have a working solution, reverse engineered from the onePassword plugin. I can only guess as to why this works, I asume it's because of adding the event to the input elements. However Change anything and it stops working (the redir call on the bottom is on the bottom for a reason)

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);

As you can see I used redirection. This example is really crude btw so don't just use it


You could try a process of redirection:

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

精彩评论

暂无评论...
验证码 换一张
取 消