63

新しいページが読み込まれるたびに Chrome 拡張機能で関数を実行init()しようとしていますが、これを行う方法を理解するのに苦労しています。私が理解していることから、background.html で次のことを行う必要があります。

  1. chrome.tabs.onUpdated.addListener()ページがいつ変更されたかを確認するために使用します
  2. chrome.tabs.executeScriptスクリプトの実行に使用します。

これは私が持っているコードです:

//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    chrome.tabs.executeScript(null, {code:"init();"});
});

//script.js
function init() {
    alert("It works!");
}

init() 関数が他の JS ファイルにある他の関数にアクセスできるかどうかも疑問に思っていますか?

4

1 に答える 1

169

Chrome拡張機能のJavaScriptコードは、次のグループに分けることができます。

  • 拡張コード-許可されているすべてのchrome.*APIへのフルアクセス。
    これには、バックグラウンドページと、ブラウザのポップアップchrome.extension.getBackgroundPage()などを介してバックグラウンドページに直接アクセスできるすべてのページが含まれます。

  • コンテンツスクリプト(マニフェストファイルまたはを介してchrome.tabs.executeScript)-一部chromeのAPIへの部分的なアクセス、ページのDOMへの完全なアクセス(フレームを含むオブジェクトへのアクセスではありません)。 コンテンツスクリプトは、拡張機能とページの間のスコープで実行されます。コンテンツスクリプトのグローバルオブジェクトは、ページ/拡張機能のグローバル名前空間とは異なります。window
    window

  • 挿入されたスクリプト(コンテンツスクリプトのこのメソッドを介して)-ページ内のすべてのプロパティへのフルアクセス。どのchrome.*APIにもアクセスできません。
    挿入されたスクリプトは、ページ自体に含まれているかのように動作し、拡張機能にはまったく接続されていません。さまざまな注入方法の詳細については、この投稿を参照してください。

挿入されたスクリプトからコンテンツスクリプトにメッセージを送信するには、イベントを使用する必要があります。例については、この回答を参照してください。注:あるコンテキストから別のコンテキストに拡張機能内で転送されるメッセージは、自動的に(JSON)シリアル化および解析されます。


chrome.tabs.onUpdatedあなたの場合、コンテンツスクリプトscript.jsが評価される前に、バックグラウンドページ()のコードが呼び出される可能性があります。ReferenceErrorではないので、を取得しますinit

また、を使用する場合はchrome.tabs.onUpdated、ページが完全に読み込まれたかどうかをテストしてください。これは、イベントが2回発生するためです。読み込み前と終了時:

//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if (changeInfo.status == 'complete') {
        // Execute some script when the page is fully (DOM) ready
        chrome.tabs.executeScript(null, {code:"init();"});
    }
});
于 2012-03-28T21:41:34.483 に答える