1

この問題を解決しようと広範囲にグーグルで検索してきましたが、解決策が見つからないようです。Chrome 拡張機能でリスナーと送信者を設定するという簡単なタスクを実行しようとしています。

私のマニフェスト

{
  "manifest_version": 2,

  "name": "my app",
  "description": "text",
  "version": "0.1",
  "background":{
    "scripts":["background.js"]
  },

  "content_scripts": [
    {
      // http://developer.chrome.com/extensions/match_patterns.html
      "matches": ["http://myurl.com/*"],
      "js": ["jquery-1.9.1.min.js", "myapp.js"],
      "all_frames": true
    }
  ], 
  "browser_action": {
    "default_icon": "/icons/icon-mini.png",
    "default_popup": "popup.html"
  }
}

私のバックグラウンドJSで

chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, function(response) {
    console.log(response.farewell);
  });
});

私の popup.js では (coffeescript によってレンダリングされます。奇妙な構文を許してください)

(function() {

  $(function() {});

  chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
    if (console.log(sender.tab)) {
      "from a content script:" + sender.tab.url;
    } else {
      "from the extension";
    }
    if (request.greeting === "hello") {
      return sendResponse({
        farewell: "goodbye"
      });
    }
  });

}).call(this);

私のmyapp.jsで

chrome.extension.sendMessage({
      greeting: "hello"
    }, function(response) {
      return console.log(response.farewell);
    });

私はチュートリアルに従いました。なぜこれが機能しないのかわかりません。私は JS にかなり慣れていますが、なぜこれが奇妙な動作をしているのかはよくわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

3

このコードには複数の問題があるので、分解してみましょう。

私が見たところ、コンテンツ スクリプトからポップアップにメッセージを送信しようとしていますが、何もしていないバックグラウンド ページがあります。

問題#1

popup.js のコードは、奇妙に複雑であることに加えて、バックグラウンド ページではありません。が開いているときにのみ実行popupされるため、メッセージをリッスンすることはできません。

問題#2

バックグラウンド ページのコードは、depreciatedgetSelectedメソッドを使用してコンテンツ スクリプトにメッセージを送信しています。コンテンツ スクリプトにはリスナーがありません。

これら 2 つのことの結果は次のとおりです。

Background page -> content script (no listener)
Content Script -> extension pages (no listener)

背景ページをコミュニケーションのハブにすることをお勧めします。ポップアップとコンテンツ スクリプトの間で通信する必要がある場合は、それを作成して返信popup -> content scriptに使用します。sendResponse()

編集:これは、必要なメッセージパッシングの例です。変数に置き換えるだけです。

コンテンツ スクリプト

...
//get all of your info ready here

chrome.extension.onMessage.addListener(function(message,sender,sendResponse){
  //this will fire when asked for info by the popup
  sendResponse(arrayWithAllTheInfoInIt);
});

現れる

...
chrome.tabs.query({'active': true,'currentWindow':true},function(tab){
  //Be aware 'tab' is an array of tabs even though it only has 1 tab in it
  chrome.tabs.sendMessage(tab[0].id,"stuff", function(response){
    //response will be the arrayWithAllTheInfoInIt that we sent back
    //you can do whatever you want with it here
    //I will just output it in console
    console.log(JSON.stringify(response));
  });
});
于 2013-03-12T19:07:47.957 に答える
0

バックグラウンド ページで同様の問題が発生したため、解決策は、メッセージを送信する前にタブの読み込みが完了していることを確認することでした。

タブが完全にロードされていない場合、コンテンツ スクリプトは開始されておらず、まだメッセージを待機していません。

ここにいくつかのコードがあります:

 chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
   if (changeInfo.status === 'complete') {
     // can send message to this tab now as it has finished loading
   }
 }

したがって、アクティブなタブにメッセージを送信する場合は、最初に読み込みが完了していることを確認できます。

于 2013-08-05T13:26:41.407 に答える