4

私の拡張機能では、 in という名前のボタンmybuttonlpopup.htmlクリックされると、 にメッセージが送信"getvar"contentscript.jsれ、次に にメッセージが送信"I want var1"background.htmlれて という名前のオブジェクトが取得されvar1ます。(という名前のボタンmybutton2も同様に設定されますがvar2、クリックするとオブジェクトが取得されます)。

これをどのように実装すればよいですか?

chrome.extension.onRequest.addListenerさらに、メソッドとメソッドについて少し混乱していchrome.extension.sendRequestます。誰か説明してくれませんか?

4

1 に答える 1

16

onRequest.addListener と sendRequest は、Chrome の拡張メッセージングの一部です。ここにありますhttp://developer.chrome.com/extensions/messaging.html

基本的に、誰かが「sendRequest」をトリガーして送信した「onRequest.addListener」を使用してリクエストをリッスンします。

あなたの場合、コンテンツスクリプトに「onRequest.addListener」を配置して、ポップアップからのリクエストをリッスンします(sendRequestを使用)。また、コンテンツ スクリプトからポップアップに応答を返して、何が起きているかを処理することができます。ポップアップでは、 chrome.extension.getBackgroundPage()を使用して背景ページに直接アクセスできます。

コンテンツ スクリプトがバックグラウンド ページにも通信するようにする場合 (これは、作業が複雑になるため必要ありません)、コンテンツ スクリプトからのリクエストのみをリッスンする「onRequest.addListener」をバックグラウンド ページに追加できます。 . そのために、Message Passingはそれを完璧に説明しています。true の場合、「sender.tab」はコンテンツ スクリプトです。

以下の例 (未テスト) は、メッセージ パッシングについて私が何を意味するかを示しています。物事を複雑にするのではなく、シンプルに保つようにしてください。

Popup.html

chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendRequest(tab.id, {method: "fromPopup", tabid: tab.id}, function(response) {
    console.log(response.data);
  });
});

ContentScript.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method == "fromPopup") {
    // Send JSON data back to Popup.
    sendResponse({data: "from Content Script to Popup"});

    // Send JSON data to background page.
    chrome.extension.sendRequest({method: "fromContentScript"}, function(response) {
      console.log(response.data);
    });
  } else {
    sendResponse({}); // snub them.
  }
});

BackgroundPage.html

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  // From content script.
  if (sender.tab) {
    if (request.method == "fromContentScript")
      sendResponse({data: "Response from Background Page"});
    else
      sendResponse({}); // snub them.
  }
});
于 2010-04-12T22:08:21.063 に答える