首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >chrome.extension.getViews()返回故障

chrome.extension.getViews()返回故障
EN

Stack Overflow用户
提问于 2013-01-02 12:46:46
回答 2查看 4.5K关注 0票数 1

我试图用这种方式从背景脚本中访问内容脚本中的一个函数-

content.js

代码语言:javascript
复制
window.DOsomething = function(){
    console.log('Works?');
}

background.js

代码语言:javascript
复制
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]列表中没有这样的方法,我真的不明白这样的结果

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-02 13:02:18

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

这里有一个有点过时的所以回答一个相关的问题,它可能有助于绘制一个完整的画面。在答案中,您应该调整代码以使用sendMessage,而不是sendRequest,后者被移除以支持第一个。

例如,在后台页面中进行以下调用(取自文档):

代码语言:javascript
复制
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);
  });
});

在内容脚本中,您应该侦听消息:

代码语言:javascript
复制
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

代码语言:javascript
复制
chrome.tabs.executeScript(tabId, {code: 'DOsomething();'})
票数 3
EN

Stack Overflow用户

发布于 2013-09-28 17:46:51

background.js

代码语言:javascript
复制
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

代码语言:javascript
复制
function DOsomething (message)
{
// CODE
}

在上面的例子中,我认为'main.html‘是您的弹出窗口(Html),并包含了content.js。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14122319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档