2016-08-04 8 views
1

他のコードがロードされているページで実行される前に、JavaScriptコードを実行する必要があります。バックグラウンドページに `run_at:start`と同等のものがありますか?

次のようにコンテンツのスクリプトを使用して正常に動作します:

{ 
    "matches": ["http://*/*", "https://*/*", "file://*/*"], 
    "js": ["contentScript.js"], 
    "run_at": "document_start" 
} 

しかし、今私は、ユーザーがブラウザのアクションボタンをクリックして選択し、特定のページ上のコンテンツのスクリプトを実行したいと思います。

chrome.tabs.onUpdatedを聞いてからexecuteScriptを呼び出してみましたが、コンテンツスクリプトの前に他のコードがページ上で実行されています。

バックグラウンドページによって挿入されたコードが他のコードより先に実行されるようにする方法はありますか?

コンテンツスクリプト内に条件を追加することもできますが、現在のtabIDと、拡張機能が有効になっているすべてのタブのリストにアクセスする必要があることを意味します。ドキュメントchrome.tabs.executeScriptによると

+1

[ 'ラナ: "document_start"'](https://developer.chrome.com/extensions/tabs#method-executeScript) – wOxxOm

+0

@wOxxOmニースは、その表示されませんでした。私のためにうまくいく。投稿していただければ幸いです。 –

答えて

2

のでできるだけ早く使用runAt: 'document_start'としてスクリプトを注入するために、(デフォルトではDOMContentLoadedイベントの後に発生する、document_idleです)runAtなど、いくつかの有用なパラメータを、持っています。

chrome.tabs.executeScript(tabId, { 
    runAt: 'document_start', 
    code: 'console.log(document.documentElement.innerHTML);', 
}); 

DOMツリーを使用すると、このようなtabs.onUpdatedやwebNavigation.onCommittedとして、早期に実行イベントリスナーから注入する場合は特に、通常はこの段階では空になって注意してください。 HEADまたはBODY要素でもまだ存在しない可能性がありますので、<style>または<script>などの追加ノードのコンテナとして(document.head || document.documentElement)フォールバックを使用する必要があります。

+0

注:runAt: 'document_start'を* manifest.json * '" run_at ":" document_start "'と比較した実際のパフォーマンスは、*厳密に*、 'tabs.executeScript( ) 'と呼んでいます。効果的には、 'runAt: 'document_start''を使うと、実際には' tabs.executeScript() 'が実行されたときを超えて意図的にスクリプトの注入が遅れていないことを意味します。ページがロードされる前に(* manifest.json *オプションを使用して保証されているように 'head'と' body'が 'null'である)スクリプトが挿入されていることを保証*しません。 – Makyen

関連する問題