2

すべてのページと内部 iframe にコンテンツ スクリプト ファイルを挿入しまし"all_frames": trueたが、ポップアップからリクエストを送信すると、トップ ウィンドウのみがそれを受信します。すべての内部フレームまたは少なくとも最後にフォーカスされたウィンドウ/ドキュメントに送信する方法はありますか?

Popup.html (page action):
===========
chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.sendRequest(tab.id, {...}, function(response) {...});
});

content_script.js
=================
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    sendResponse({...});
});

コンテンツ スクリプトが内部フレームで動作することを確認しました。

内部フレームにある可能性のあるテキスト選択を取得しようとしています。

(ちなみに、すべてのコンテンツ スクリプトで接続を開くことは好まないため、オーバーヘッドが大きくなります。)

4

1 に答える 1

3

onRequest問題は、1 つのタブにリスナーを 1 つしか持てないことです。したがって、メッセージをiframe スクリプトのみに送信したい場合で、ページに iframeが1 つしかない場合は、iframe 内にのみリスナーを作成する必要があります。

//listen to requests only inside iframe
if(window!=window.top) {
    chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
        ...
    });
}

親ページと iframe の両方にリクエストを送信する場合、またはリクエストをリッスンする必要があるページに多数のiframe がある場合は、ポートを介して通信する必要があります。

ポートにも同様の制限があります。呼び出されるポート リスナーは 1 つだけですが、多くのポートを開くことができます。iframe が 1 つしかない親ページがある場合は、2 つの異なるポートで 2 つの接続を開くだけです。ただし、ページに多数の iframe があり、各 iframe にサブフレームがある場合は、最初にすべての iframe を列挙して、それぞれに固有のポートを作成する必要があります。

PS。私はあなたが何を意味したのか分かりません

すべてのコンテンツ スクリプトで接続を開きたくない

ただし、オンデマンドでコンテンツ スクリプトを挿入する場合は、 chrome.tabs.executeScript().

于 2011-06-18T01:31:16.980 に答える