8

background.html

chrome.tabs.query({active:true, currentWindow:true},function(tabs){
  chrome.tabs.sendMessage(tabs[0].id,"target.js");
});

content.js

chrome.extension.onMessage.addListener(function(msg,sender,sendResponse){
  if (msg == "target.js"){
    extensionID = sender.id;
  }
});

ただし、機能しません。

Uncaught TypeError: Cannot read property 'onMessage' of undefined 

それを正しくする方法は?

4

2 に答える 2

14

「content.jsはコンテンツスクリプトであり、別のコンテンツスクリプトによって現在のタブに挿入されます。」とおっしゃいました。

ここにあなたの問題があります。挿入されたスクリプトは、ページのコンテキストで実行されるため(ページ自体によって作成されたかのように)、Chrome拡張APIにアクセスできません。

カスタムイベントを使用するかpostMessage、ページとコンテンツスクリプト間で通信し、コンテンツスクリプトがバックグラウンドページと通信することができます。

たとえば、次の基本的な例を参照してください。

    // Injected script script
    addEventListener('message', function(event) {
        if (event.data && event.data.extensionMessage) {
            alert(event.data.extensionMessage);
        }
    });
    // Content script which injects the script:
    chrome.extension.onMessage.addListener(function(message) {
        postMessage({extensionMessage: message}, '*');
    });

content.jsただし、挿入されたスクリプトではなく、実際のコンテンツスクリプトとして使用したいと思います。インジェクトされたスクリプトとコンテンツスクリプトの違いを知りたい場合は、Chrome拡張コードとコンテンツスクリプトとインジェクトされたスクリプトを参照してください。

于 2012-10-21T15:22:40.410 に答える
-1

現在のタブに対して何らかのアクションを実行しようとしているようです。そのためにメッセージが必要ですか?background.htmlが拡張機能のバックグラウンドページであり、content.jsがコンテンツスクリプトであると想定しています。ここで、background.htmlページをスキップして、バックグラウンドページのjavascriptファイルを実行します。私のmanifest.jsonページは次のようになります。

  "background": {
     "scripts": [ "js/background.js"]
  },

そのページでは、background.jsファイルを操作する唯一の方法であるため、バックグラウンドページにメッセージリスナーを追加します。ただし、あなたの場合、アクションを実行するのはバックグラウンドページであるため、chrome.tabメソッドを使用して現在のタブを直接変更できます。onMessageの代わりに、InjectDetailsがjavascriptまたは実行したいものであるexecuteScriptを試すことができます。

chrome.tabs.query({active:true, currentWindow:true},function(tabs){
         chrome.tabs.executeScript(tabs[0].id, InjectDetails);
});

詳しくはこちらをご覧ください。

于 2012-10-19T19:04:47.787 に答える