Кажется, что Gmail захватывает все события клавиатуры. Любой способ обойти это?

Я пишу расширение Chrome, которое запускает script с помощью сочетания клавиш. Он отлично работает на большинстве страниц, но я понял, что в Gmail это не так: кажется, что все события клавиатуры захватываются Gmail и не имеют пузырьков до моей функции.

У меня есть контент script (в расширении Chrome это добавляется на любую желаемую страницу), которая (упрощена):

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

Но на самом деле, Gmail меня подвела. Я знаю, что загружается script. Я пробовал разные варианты window.addEventListener и других типов событий безрезультатно.

Кто-нибудь знает, как обойти это? Я пытался увидеть, может ли GreaseMonkey script сделать это, что привело меня сюда: http://code.google.com/p/gmail-greasemonkey/, но это меня не помогло.

Спасибо!

Ответ 1

Я не знаю, как работает работа с клавиатурой GMail, но недавно я написал простой навигатор с клавиатурой (поэтому мне не нужно использовать мышь для кликов) для Chrome.

Это не расширение, а пользователь /Greasemonkey script, но он срабатывает, вводя запятую (,) дважды, и он работает в GMail.

Возможно, это поможет вам взглянуть на источник. Вы можете скачать его здесь: http://userscripts.org/scripts/show/68609

Ответ 2

Хорошо, у меня есть рабочее решение, обратное проектирование из плагина 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);

Как вы видите, я использовал перенаправление. Этот пример действительно грубый, поэтому не просто используйте его

Ответ 3

Вы можете попробовать процесс перенаправления:

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