Javascript chrome扩展弹出窗口能否知道它是否是第一次打开的?

Javascript chrome扩展弹出窗口能否知道它是否是第一次打开的?,javascript,google-chrome-extension,tabs,popup,content-script,Javascript,Google Chrome Extension,Tabs,Popup,Content Script,我正在构建一个扩展,其中弹出窗口用作UI界面,而操作在内容脚本中进行 问题是:弹出窗口可以在选项卡的整个生命周期中打开和关闭,但如果是第一次打开,其行为应该有所不同。例如,它应该只在第一次打开时执行内容脚本 有没有办法让弹出窗口知道它是否是第一次在当前选项卡上打开的?对于浏览器扩展,我不是专家,所以其他人可能会有更好的解决方案,但是,当你在选项卡中打开弹出窗口时,也许你可以将选项卡的ID存储在本地存储或会话存储中,然后,无论何时打开弹出窗口,您都可以检查本地/会话存储中是否已找到该ID,以了解它

我正在构建一个扩展,其中弹出窗口用作UI界面,而操作在内容脚本中进行

问题是:弹出窗口可以在选项卡的整个生命周期中打开和关闭,但如果是第一次打开,其行为应该有所不同。例如,它应该只在第一次打开时执行内容脚本


有没有办法让弹出窗口知道它是否是第一次在当前选项卡上打开的?

对于浏览器扩展,我不是专家,所以其他人可能会有更好的解决方案,但是,当你在选项卡中打开弹出窗口时,也许你可以将选项卡的ID存储在本地存储或会话存储中,然后,无论何时打开弹出窗口,您都可以检查本地/会话存储中是否已找到该ID,以了解它以前是否已被打开

您可能需要在内容脚本内部执行检查(我不确定弹出窗口本身到底可以运行什么),但是如果以前运行过,您可以防止它运行两次

解决方案: 每次打开弹出脚本时,从弹出脚本发送一次性消息:

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.
        }
} 
在内容脚本中,您需要为
消息
事件创建一个处理程序:

chrome.runtime.onMessage.addListener((req, sender, sendResp) => {
    if (req.event && req.event === 'popup-ready') {
        sendResp({event: 'content-ready'});
    }
});

localStorage和sessionStorage对象似乎不会在不同的弹出实例中共享,因为根据a,“每次创建
ExtensionHost
时,它都会创建一个带有新会话存储命名空间id的
RenderViewHost
”。不过,它使用Chrome的浏览器工作,所以谢谢你!不过还是希望有更优雅的东西。这个bug是关于
sessionStorage
的,这是每个窗口应该有的。但是,
localStorage
是在整个源代码中共享的,即在扩展的浏览器动作弹出窗口的所有实例之间共享的,正如规范P.s.所述。该错误也是无效的,因为每次都会重新创建弹出窗口,这就是弹出API的实现方式。您可以使用它来查询内容脚本。