4

私の拡張機能では、あるタブのコンテンツ スクリプトから別のタブのコンテンツ スクリプトにデータを転送する必要があります。そのタブオブジェクトの名前またはURLの一部を知っている場合、chrome.tabsを使用して特定のタブを選択するにはどうすればよいですか? 2 つのタブのスクリプトはどのように通信できますか?

アップデート:

どうやら、chrome.extension にメソッド sendMessage がありません。コンテンツスクリプトから次を実行すると:

chrome.extension.sendMessage("message");

コンソールに入ります:

キャッチされていない TypeError: オブジェクト # にはメソッド 'sendMessage' がありません

4

2 に答える 2

5

まず、拡張機能内で渡されるメッセージは JSON でシリアル化されることに注意してください。関数などのシリアル化できない型はメッセージに含まれません。

コンテンツ スクリプト内では、メッセージをバックグラウンド ページに渡す必要があります。これは、他のタブに直接アクセスする方法がないためです。

// Example: Send a string. Often, you send an object, which includes
//  additional information, eg {method:'userdefined', data:'thevalue'}
chrome.extension.sendMessage(' ... message ... ');

バックグラウンド ページで、 メソッドを使用しchrome.tabs.queryてタブの ID を取得します。例を簡単にするために、パターンと URL をハードコーディングしました。次のように、前のメッセージのクエリ値を含めることをお勧めします{query:{...}, data:...}

// background script:
chrome.extension.onMessage.addListener(function(details) {
    chrome.tabs.query({
        title: "title pattern",
        url: "http://domain/*urlpattern*"
    }, function(result) {
        // result is an array of tab.Tabs
        if (result.length === 1) { // There's exactely one tab matching the query.
            var tab = result[0];
            // details.message holds the original message
            chrome.tabs.sendMessage(tab.id, details.message);
        }
    });
});

chrome.tabs.sendMessage元のデータを別のタブに渡すために使用されました。

注: この例では、クエリの結果が 1 つの一意のタブになったときにのみメッセージを渡しました。result.forEach一意性が前提条件でない場合は、またはを使用して、結果のすべてのタブをループします。

for (var i=0, tab; i<result.length; i++) {
    tab = results[i];
    ...
}
于 2012-07-22T09:33:03.973 に答える
1

コンテンツ スクリプトからは、バックグラウンド プロセスとのみ通信できます。バックグラウンドを中間として使用して、異なるタブ内の 2 つのコンテンツ スクリプト間で通信することができます。

また、DOM は DOM ウィンドウ間で通信するための別の方法を提供しますが、オリジン ポリシーは同じです...

タブの URL を取得するには、コンテンツ スクリプトを実行します。コンテンツ スクリプトは、window.location.href を使用して URL を取得できます。

于 2012-07-22T04:10:10.283 に答える