1

我正在尝试以这种方式从我的后台脚本访问内容脚本中的函数-

内容.js

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

背景.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)在我的内容脚本中这样做时 - 它告诉我,这种方法 ( DOsomething) 存在!但是在popups[0]列表中没有这样的方法,我真的不明白这样的结果

4

2 回答 2

3

这是 Chrome 扩展程序的一个已知功能,称为孤立世界。内容脚本被注入到目标页面中,不能直接从扩展的其他部分访问。要进行交互,您应该使用消息传递

这是对相关问题的一个有点过时的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

背景.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;
    }
}

内容.js

function DOsomething (message)
{
// CODE
}

在上面的示例中,我认为“main.html”是您的弹出窗口(html)并且包含 content.js。

于 2013-09-28T17:46:51.280 回答