2016-04-20 2 views
0

Я создаю расширение, которое позволит пользователям использовать хромированную вкладку, переключающуюся на браузер Vivaldi.Расширение Chrome keydown слушателя в background.js

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

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

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

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, чтобы она выполнялась независимо от действий браузера.

+0

Только контент-скрипт имеет доступ к DOM, относящемуся даже к текущей веб-странице, что означает «для этого требуется, чтобы все новые вкладки были полностью загружены, прежде чем я мог отправлять сообщения на сценарий background.js»? Когда вы хотите, чтобы ваши скрипт, который должен быть выполнен? –

+0

Я хочу, чтобы мой скрипт выполнялся независимо от того, какие вкладки загружены. @HaibaraAi - это переключатель вкладок, поэтому, если я открою новую вкладку, я хочу использовать комбинацию клавиш для переключения на вкладку один с, например, ctrl + 1, что я могу сделать, но мне просто нужно дождаться загрузки новой вкладки. –

+0

, тогда я считаю, что @Xan прав, 'chrome.commands' для этой цели, хотя многие ограничения, как и все ключевые комбинации должны включать Ctrl или Alt, .... –

ответ

2

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

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

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

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

+0

Я понимаю это - однако, полагаясь на события DOM, требуется, чтобы новая вкладка была загружена, прежде чем я могу вернуться к вкладка «Ночер»; Например: вы открываете новую вкладку (ctrl + t) - скрипт content.js запускается и начинает прослушивать запросы при загрузке веб-страницы, но в это время ctrl + 1/2/3/4. не будет выбран слушателем для переключения на соответствующие вкладки. @Xan –

+0

Это потому, что все «попытки собирать нажатия клавиш по скриптам контента» - это взлом, когда семантически вы хотите, чтобы они работали в любом месте браузера. Это не будет работать надежно, период. У вас есть инструмент - chrome.commands' - для ярлыков в браузере, но у него есть ограничения, с которыми вам придется жить. – Xan

+0

Обратите внимание, что у меня есть подробный ответ о том, какие ярлыки разрешены: http://stackoverflow.com/a/28410213/934239 Например, вы не можете переопределять существующие ярлыки Chrome. – Xan