chrome.extension.getViews()返回麻烦

时间:2013-01-02 12:46:46

标签: javascript google-chrome-extension

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

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

2 个答案:

答案 0 :(得分:3)

这是Chrome扩展程序的一项名为isolated world的已知功能。内容脚本被注入目标页面,无法直接从扩展的其他部分访问。要进行互动,您应该使用messaging

这有点过时SO answer to a related question,这可能有助于全面了解。在答案中,您应该调整代码以使用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();'})

{{1}}

答案 1 :(得分:-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。