1

そのようにして、バックグラウンドスクリプトからコンテンツスクリプトの関数にアクセスしようとしています-

content.js

window.DOsomething = function(){
    console.log('Works?');
}

background.js

var popups = chrome.extension.getViews();
if (popups.length != 0) {
            var popup = popups[0];
            popup.DOsomething();
}

しかし、それは機能していません!エラーがスローされますが、コンテンツスクリプトで実行すると、そのようなメソッド()が存在することが示されUncaught TypeError: Object [object Window] has no method 'DOsomething'ます。しかし、リストにそのような方法がないので、私はそのような結果を本当に理解していませんconsole.log(window)DOsomethingpopups[0]

4

2 に答える 2

3

これは、孤立した世界と呼ばれる Chrome 拡張機能の既知の機能です。コンテンツ スクリプトはターゲット ページに挿入され、拡張機能の他の部分から直接アクセスすることはできません。対話するには、messagingを使用する必要があります。

これは、全体像を把握するのに役立つ関連する質問に対する少し古いSOの回答です。答えでは、最初のものを優先して削除されたsendMessageの代わりにコードを調整する必要があります。sendRequest

たとえば、バックグラウンド ページに次の呼び出しを配置し​​ます (ドキュメントから抜粋)。

chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, // you can send "DoSomething" for example
  function(response) {
    console.log(response.farewell);
  });
});

コンテンツ スクリプトでは、次のメッセージを聞く必要があります。

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

getViewsコンテンツ スクリプトが挿入されたページではなく、拡張ページ (背景、ポップアップ、オプション) を返すため、メソッドは必要なものではないと思います。sendMessageコンテンツ スクリプトからバックグラウンド ページに移動して、後ですべてのスクリプト ホスト ページを「認識」するか、executeScript.

chrome.tabs.executeScript(tabId, {code: 'DOsomething();'})
于 2013-01-02T13:02:18.147 に答える
-1

background.js

var message = "What ever you want...";
var viewTabUrl = chrome.extension.getURL('main.html');
var views = chrome.extension.getViews();
for (var i = 0; view = views[i]; i++)
{
    if (view.location.href == viewTabUrl)
    {
        view.DOsomething (messages);
        break;
    }
}

content.js

function DOsomething (message)
{
// CODE
}

上記の例では、「main.html」がポップアップ(html)であり、content.jsが含まれていると考えています。

于 2013-09-28T17:46:51.280 に答える