2016-04-20 7 views
0

私は、ユーザーがVivaldiブラウザでクロムのようなタブの切り替えを使用できるようにする拡張機能を作成しています。background.jsのChrome拡張キーダウンリスナー

私はもともとcontent.jsスクリプトによって処理されたイベントがあった

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

を試してみましたが、私のbackground.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に移動して、ブラウザの動作とは独立して実行したいと考えています。

+0

現在のWebページでもコンテンツスクリプトだけがDOM関連のものにアクセスできますが、これは、「これはbackground.jsスクリプトにメッセージを送信する前に、新しいタブを完全に読み込む必要がありますか?スクリプトが実行されるのですか? –

+0

どのタブが読み込まれているかに関係なくスクリプトが実行されます。@HaibaraAi - タブスイッチャーです。新しいタブを開くと、キーの組み合わせを使用してタブ1に戻ることができます例えば、Ctrl + 1を押しても可能ですが、新しいタブが最初に読み込まれるのを待つだけです。 –

+0

@Xanは正しいと思います。「chrome.commands」はその目的のためです。キーの組み合わせにCtrlまたはAltを含める必要があります。 –

答えて

2

DOMキーボードイベントリスナーは、フォーカスがページ内にあるときに発生するキーストロークのみをキャプチャします。

バックグラウンドページは表示できません。そのため、フォーカスすることはできません。入力イベントは一切受信されません。

chrome.commands APIを調べることはできますが、かなり制限があります。正当な理由で:実際には、は、すべてのキーストロークを収穫できるだけの拡張機能を望んでいません。

(有効な)コマンドを使用して制限をバイパスすると、という拡張子が呼び出され、そのポップアップが開き、DOMリスナーでさらにイベントを取得できます。

+0

私はこれを理解していますが、DOMイベントに依存するには、新しいタブをロードしてから、ノートタブ。 例:新しいタブ(ctrl + t)を開くと、content.jsスクリプトが起動し、Webページを読み込んだときにその要求がctrl + 1/2/3/4に読み込まれます。これらの各タブに切り替えるためにリスナーがピックアップしません。 @Xan –

+0

「コンテンツスクリプトでキーストロークを収集しようとしている」という全体が、意味的にブラウザのどこにいても動作させるためには、ハックだからです。期間は確実には機能しません。ブラウザ全体のショートカットには 'chrome.commands'というツールがありますが、それには制限があります。 – Xan

+0

どのような種類のショートカットが許可されているかについては、詳細な回答があります。http://stackoverflow.com/a/28410213/934239たとえば、Chromeの既存のショートカットを上書きすることはできません。 – Xan