我在Chrome扩展程序中创建一个新窗口,如下所示:
chrome.windows.create({
url: 'https://example.com',
focused: false,
state: "minimized"
}, function(hiddenWindow) {
var code = "console.log('Some JS code goes here');"
chrome.tabs.onUpdated.addListener(function(tabId, info) {
if (info.status === 'complete') {
chrome.tabs.executeScript(hiddenWindow.tabs[0].id, {
code: code
},
function(results) {
console.log(results);
});
}
});
});
可以通过某种方式做到这一点:
将感谢您的帮助和想法!
答案 0 :(得分:1)
将窗口的ID存储在变量中(例如,全局变量)并使用chrome.windows.get
-当窗口关闭时,API将在chrome.runtime.lastError
中返回错误。另外,与其关闭上一个标签,不如将现有标签导航到新URL似乎更简单。
现在,上述方案将要求我们在最糟糕的情况下或在Promises的情况下最好使用精心设计的级联回调,但是由于是在2019年,所以我们使用现代的 async / await 语法代替{ {3}}。
let wndId;
const wndOptions = {
focused: false,
state: 'minimized',
};
const code = `(${() => {
console.log('Some JS code goes here');
}})()`;
async function openMinimized(url) {
const w =
wndId &&
await browser.windows.get(wndId, {populate: true}).catch(() => {}) ||
await browser.windows.create({url, ...wndOptions});
wndId = w.id;
const [wTab] = w.tabs;
if (wTab.url !== url) browser.tabs.update(wTab.id, {url});
return new Promise(resolve => {
browser.tabs.onUpdated.addListener(async function onUpdated(tabId, info) {
if (tabId === wTab.id && info.status === 'complete') {
browser.tabs.onUpdated.removeListener(onUpdated);
resolve(browser.tabs.executeScript(tabId, {code}));
}
});
});
}
用法:
openMinimized('https://example.com').then(results => {
console.log(results);
});
注意:
code
可以作为普通的JS编写,并且在模板字符串的IIFE中突出显示语法如何使用polyfill:从Mozilla WebExtension polyfill的官方仓库下载browser-polyfill.min.js
,保存在扩展程序目录中,然后像扩展程序中的任何其他脚本一样加载它,例如,作为manifest.json中的后台脚本:
"background": {
"scripts": ["browser-polyfill.min.js", "background.js"]
}