6

.js ファイルでグローバル オブジェクトを定義しました。たとえば、file1.js にはグローバル オブジェクト SomeObject が含まれています。このファイルは background.html にロードされます。

file1.js は background.html に含まれているため、このページでグローバル オブジェクトにアクセスできます。したがって、ここでは問題ありません。

拡張ボタンのクリックなどのイベントが実行されると、chrome.tabs.executeScript(null, {file: "contentscript.js"});API を使用してコンテンツ スクリプトを実行しています。

この場合、コンテンツスクリプトで SomeObject にアクセスするにはどうすればよいですか?

4

1 に答える 1

21

コンテンツ スクリプトまたは挿入されたスクリプトからバックグラウンド ページのグローバル オブジェクトに直接アクセスする方法はありません。

挿入されたスクリプトからバックグラウンド ページのメソッドを使用するには、次の手順に従います。

  1. コンテンツ スクリプト: イベント リスナーをページの例 1にバインドします。
    バックグラウンドページからメソッドに通知したいときはいつでも:
  2. 注入されたスクリプト: この特定のイベント例 1を作成して起動します。 → 1)
    のイベントリスナーがトリガーされます。
  3. このイベント リスナーでは、バックグラウンドの例 2chrome.runtime.sendMessageの機能を要求するために使用します。
  4. バックグラウンド ページで、 を使用してこのリクエストを処理しchrome.runtime.onMessageます。
  5. 必要に応じて、 を使用して元のタブにコードを挿入しますchrome.tabs.executeScript(tab.id, func)

コンテンツ スクリプトから背景ページのメソッドを使用するには、手順 3 と 4 のみが必要です。
コンテンツ スクリプトがバックグラウンド ページと通信する例を次に示します。

// Example background page
function some_method(arg_name) {
    return localStorage.getItem(arg_name);
}
chrome.runtime.onMessage.addListener(function(request, sender, callback) {
    if (request.type == 'localStorage - step 4') {
        callback( some_method(request.name) );
    } else if (request.type == 'localStorage - step 5') {
        localStorage.setItem(request.name, request.value);
    }
});

// Example contentscript.js
chrome.runtime.sendMessage({
    type: 'localStorage - step 4',
    name: 'preference'
}, function(value) {
    if (value === null) {
        // Example: If no preference is set, set one:
        chrome.runtime.sendMessage({
            type: 'localStorage - step 5',
            name: 'preference',
            value: 'default'
        });
    }
});

こちらもご覧ください

于 2012-04-07T10:39:50.003 に答える