chrome 扩展弹窗能知道它是否是第一次打开吗?
Can a chrome extension pop-up know if it is being opened for the first time?
我正在构建一个扩展,其中弹出窗口用作 UI 界面,而操作发生在内容脚本中。
问题在于:弹出窗口可以在选项卡的整个生命周期内打开和关闭,但如果是第一次打开,其行为应该会有所不同。例如,它应该只在第一次打开时执行内容脚本。
有没有办法让弹出窗口知道它是否是在当前选项卡上第一次打开?
我不是浏览器扩展方面的专家,所以其他人可能有更好的解决方案,但是,也许您可以在每次打开选项卡中的弹出窗口时将选项卡的 ID 存储在 localStorage 或 sessionStorage 中,然后每当您打开弹出窗口时,您可以检查是否已在 local/session 存储中找到该 ID 以了解它之前是否已被打开?
您可能必须在内容脚本中执行检查(我不确定弹出窗口本身 运行 到底是什么),但是您可以阻止它 运行ning两次,如果之前 运行。
解决方案:
每次打开时从弹出脚本发送一次性消息:
const errString = "Could not establish connection. Receiving end does not exist.";
chrome.tabs.query({active: true}, (tabs) => {
let tabId = tabs[0].id;
chrome.tabs.sendMessage(tabId, {event: 'popup-ready'}, {}, (response) => {
let lastError = chrome.runtime.lastError;
if (lastError && lastError.message == errString) {
// Content script not in place -> pop-up running for the first time.
// Run content script...
} else if (response.event == 'content-ready') {
// Content script in place -> pop-up not running for the first time.
}
}
在内容脚本中,您需要为 message
事件创建处理程序:
chrome.runtime.onMessage.addListener((req, sender, sendResp) => {
if (req.event && req.event === 'popup-ready') {
sendResp({event: 'content-ready'});
}
});
我正在构建一个扩展,其中弹出窗口用作 UI 界面,而操作发生在内容脚本中。
问题在于:弹出窗口可以在选项卡的整个生命周期内打开和关闭,但如果是第一次打开,其行为应该会有所不同。例如,它应该只在第一次打开时执行内容脚本。
有没有办法让弹出窗口知道它是否是在当前选项卡上第一次打开?
我不是浏览器扩展方面的专家,所以其他人可能有更好的解决方案,但是,也许您可以在每次打开选项卡中的弹出窗口时将选项卡的 ID 存储在 localStorage 或 sessionStorage 中,然后每当您打开弹出窗口时,您可以检查是否已在 local/session 存储中找到该 ID 以了解它之前是否已被打开?
您可能必须在内容脚本中执行检查(我不确定弹出窗口本身 运行 到底是什么),但是您可以阻止它 运行ning两次,如果之前 运行。
解决方案:
每次打开时从弹出脚本发送一次性消息:
const errString = "Could not establish connection. Receiving end does not exist.";
chrome.tabs.query({active: true}, (tabs) => {
let tabId = tabs[0].id;
chrome.tabs.sendMessage(tabId, {event: 'popup-ready'}, {}, (response) => {
let lastError = chrome.runtime.lastError;
if (lastError && lastError.message == errString) {
// Content script not in place -> pop-up running for the first time.
// Run content script...
} else if (response.event == 'content-ready') {
// Content script in place -> pop-up not running for the first time.
}
}
在内容脚本中,您需要为 message
事件创建处理程序:
chrome.runtime.onMessage.addListener((req, sender, sendResp) => {
if (req.event && req.event === 'popup-ready') {
sendResp({event: 'content-ready'});
}
});