将值从background.js传递给弹出窗口

时间:2015-10-23 08:38:43

标签: google-chrome google-chrome-extension

在background.js中,我创建了一个类似的弹出窗口:

chrome.windows.create({
    focused: true,
    width: 1170,
    url : "settings/index.html",
    type: "popup"
}, function(popup) {
    tab_app = popup.id;
    alert(tab_app);
});

我将id存储在tab_app中。

如何将background.js中的值传递给弹出窗口?

我这样想:

chrome.tabs.executeScript(tab_app, {code: "alert("+message.add+");"});

但它一直告诉我这个标签不存在..我假设它因为它是一个弹出窗口。会很感激一些帮助。

2 个答案:

答案 0 :(得分:1)

由于它是您的扩展程序页面,因此选择的方法是Messaging

注意:您不能使用chrome.tabs.sendMessage的每标签消息传递,因为这明确地针对内容脚本上下文(扩展页面不存在)。您需要使用将发送到所有其他扩展程序页面的“广播”chrome.runtime.sendMessage

如果一次可以有多个弹出窗口类型,这可能是个问题 - 你需要一些标识符。您可以将其作为URL参数或URL哈希传递,例如"settings/index.html?id=foo""settings/index.html#foo"。如果你不期望有多个弹出式窗口(你可以在打开新窗口之前检查一个窗口是否打开),这没关系。

如果你真的需要动态代码加载或执行,而不仅仅是传递数据(可疑),你需要注意CSP

  • 您只需在文档中创建并添加<script>标记,即可从扩展程序包中动态加载脚本。
  • 但是,默认情况下,您不能在扩展上下文中传递一串代码和eval。您可以'unsafe-eval'添加到CSP字符串中,但这通常是一个坏主意。
  • 最有可能的是,您只需要将一些命令与数据一起传递。纯粹的消息传递非常适合它,只需查看文档。

old answer of mine可能有用 - 我正在使用打开新标签并在那里传递数据进行打印。

答案 1 :(得分:0)

您无法在executeScript页面中致电extension。如果您尝试在扩展程序页面中使用executeScript。它会显示错误:

  

运行tabs.executeScript时未经检查的runtime.lastError:不能   访问网址的内容   &#34;铬 - 延伸://extension_id/yourPage.html" ;.   扩展清单必须请求访问此主机的权限

现在,您无法在"chrome-extension://<extension_id>/yourPage.html" permissions下添加manifest.json,因为它无效且不允许。  相反,您可以使用message passing

<强> background.js:

  function createNewtab(){
    var targetId = null;
     chrome.tabs.onUpdated.addListener(function listener(tabId, changedProps) {

      if (tabId != targetId || changedProps.status != "complete")
        return;

     chrome.tabs.onUpdated.removeListener(listener);
      chrome.tabs.sendMessage(targetId, {message : "loadNewTab"},function(response){
          // do nothing yet
      });

     });

    chrome.windows.create({
       focused: true,
       width: 1170,
       url : chrome.extension.getURL("settings/index.html"),
       type: "popup"
       }, function(popup) {
           targetId = popup.tabs[0].id;       
    });
}

<强> index.js:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
    switch (request.message){
        case "loadNewTab":
            alert("HI")
            break;
    }
});