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'});
    }
});