Прослушиватель клавиатуры Chrome с расширением Chrome

Я создаю расширение, которое позволит пользователям использовать хром-подобное переключение вкладок в браузере Vivaldi.

В моем background.js я пытался

addEventListener("keydown", function(e) {
    console.log(e.code); // never gets here
})

Первоначально у меня было событие, обрабатываемое сценарием content.js, однако для этого требовалось полностью загрузить все новые вкладки, прежде чем я смогу отправлять сообщения в сценарий background.js.

function Listener()
{
    this.stage = 0;
    this.listen();
}

Listener.prototype.listen = function()
{
    addEventListener("keydown", this.handleKeyDown);
    addEventListener("keyup", this.handleKeyUp);
}

Listener.prototype.handleKeyDown = function(event)
{
    for(var i = 0; i < 9; i++) {
        if(event.ctrlKey) {
            if(event.code == "Digit" + (i + 1)) {
                chrome.runtime.sendMessage({
                    greeting: i
                }, function(response) {
                    console.log(response);
                })
            }
        }
    }
}
new Listener();

Я хочу переместить эту функциональность в мой background.js, чтобы он работал независимо от действий браузера.

1 ответ

Решение

Слушатели событий клавиатуры DOM фиксируют только нажатия клавиш, которые происходят, когда фокус находится на странице.

Фоновая страница не может быть отображена и не может быть сфокусирована. Он никогда не получит никаких входных событий.

Вы можете посмотреть в chrome.commands API, но это довольно ограничительное. По уважительной причине: вы действительно не хотите, чтобы расширения могли просто использовать все нажатия клавиш.

Вы можете частично обойти ограничения, используя (действительную) команду для вызова вашего расширения, которое откроет его всплывающее окно, которое, в свою очередь, может перехватывать дальнейшие события с помощью прослушивателей DOM.

Другие вопросы по тегам