在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+");"});
但它一直告诉我这个标签不存在..我假设它因为它是一个弹出窗口。会很感激一些帮助。
答案 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;
}
});