0

Chrome 拡張機能で、選択したテキストを PHP Web ページに投稿しようとしています。この Web サイト ( Chrome 拡張機能: 選択したテキストをキャプチャして Web サービスに送信する方法) で解決された質問は、これを達成するのに大いに役立ちましたが、テキストを投稿する別の方法が必要です。
そこに記載されている XMLHttpRequest の代わりに、コンテンツ スクリプトから非表示の JS フォームを送信したいと考えています。この方法により、データベースにインポートする前にテキストを表示または変更できます。

問題は、バックグラウンドからコンテンツ スクリプトへのトリガーを取得することです。私はすでに他の方法でメッセージを持っているので、関数(応答)を使用することが望ましいです。ただし、「sendMessage」の外では、response.cmd をリッスンできません。そして、「sendMessage」内で、関数をトリガーする response.cmd を取得できません。バックグラウンドスクリプトからまったく新しいメッセージを送信する以外に、これに対する解決策はありますか? 私が参照しているコード:

Background.js

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if(request.cmd == "createSelectionMenu") {
    sendResponse({cmd: "saveText"}); //Do things
  }
});

Content_script.js

chrome.extension.sendMessage({ cmd: "createSelectionMenu", data: selectedText },
  function(response) {
    if(response.cmd == "saveText") { 
      createForm();
    }
  }
});
4

1 に答える 1

2

私がしていることは次のとおりです。

開いているタブを追跡します

コンテンツ スクリプト:

// connect to the background script
var port = chrome.extension.connect();

バックグラウンド スクリプト

// a tab requests connection to the background script
chrome.extension.onConnect.addListener(function(port) {
  var tabId = port.sender.tab.id;
  console.log('Received request from content script', port);

  // add tab when opened
  if (channelTabs.indexOf(tabId) == -1) {
    channelTabs.push(tabId);
  }

  // remove when closed/directed to another url
  port.onDisconnect.addListener(function() {
    channelTabs.splice(channelTabs.indexOf(tabId), 1);
  });
});

これで、特定のアクションが発生したときに、バックグラウンド スクリプトから登録済みのすべてのタブ (つまり、コンテンツ スクリプト) に通知できます。

var notification = { foo: 'bar' };
for(var i = 0, len = channelTabs.length; i < len; i++) {
  chrome.tabs.sendMessage(channelTabs[i], notification, function(responseMessage) {
    // message coming back from content script
    console.log(responseMessage);
  });
}

また、コンテンツ スクリプトの反対側では、これらのメッセージにリスナーを追加できます。

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.foo == 'bar') {
    executeStuff();
    // if a callback is given:
    sendResponse && sendResponse('success');
  }
});

いくつかの場所で冗長であるため、少し頭がおかしいです。しかし、ラップして少し簡単にすることができるので、私はその方法が一番好きです.

私がこれをどのように使用しているかを確認したい場合は、GitHub の私のリポジトリを参照してください: chrome-extension-communicator

于 2012-11-13T19:20:30.287 に答える