后台脚本中的 if/else 不会在扩展点击时执行,而是仅在解压缩的扩展刷新后执行

The if/else in background script does not execute on extension click but only after unpacked extension refresh

我正在尝试加载包含 if/else 语句的后台脚本(扩展名-starter.js)。我在本地存储中存储了用户对如何打开扩展程序(弹出窗口、新 window、新选项卡)的偏好。打开扩展程序后,我希望它能检索保存的值并适当地打开扩展程序,但由于某些原因,在更改首选项时(例如从弹出窗口到新选项卡),单击扩展程序图标会以以前的状态打开扩展程序。只有在我刷新解压的扩展程序后,它才会按预期打开应用程序。

    // Here is the manifest.json...(took out unnecessary info)
    {
    "manifest_version": 2,
    "background": {
    "persistent": false,
    "scripts": ["extension-starter.js"]
    },
    "browser_action": {}
}
    // Here is the extension-starter.js...
    const extPrefer = localStorage.getItem('extensionPreference');

    if (extPrefer === null) {
    localStorage.setItem('extensionPreference', 'popup');
    }

    chrome.browserAction.onClicked.addListener(function () {
    if (extPrefer === 'window') {
        chrome.windows.create({url: chrome.runtime.getURL("index.html"), width: 500, height: 600});
    }
    else if (extPrefer === 'tab') {
        chrome.tabs.create({url:chrome.extension.getURL("index.html")});
    }
    else {
    chrome.browserAction.setPopup({
        popup: "index.html"
    });
    }
    })

我希望从本地存储中检索保存的首选项并以所需方式打开扩展程序。


更新 以上问题是由chrome.browserAction.setPopup({popup: "index.html"});引起的。一旦执行 setPopup,我就无法更新回 window 或选项卡首选项。似乎 setPopup 正在清单上设置,并且在将首选项从弹出窗口更改为选项卡或 window 时无法被覆盖。

更新问题: 1、有没有办法做到setPopup的反话? 2.setPopup还有其他方法吗?

请试一试,然后告诉我效果如何:

    if (localStorage.getItem('extensionPreference') === null) {
        localStorage.setItem('extensionPreference', 'popup');
    }

    chrome.browserAction.onClicked.addListener(function () {
        // move this inside the click function
        const extPrefer = localStorage.getItem('extensionPreference');

        if (extPrefer === 'window') {
            chrome.windows.create({ url: chrome.runtime.getURL("index.html"), width: 500, height: 600 });
        }
        else if (extPrefer === 'tab') {
            chrome.tabs.create({ url: chrome.extension.getURL("index.html") });
        }
        else {
            chrome.browserAction.setPopup({
                popup: "index.html"
            });
        }
    })

好的,我明白了!下面我将解释最终的问题,然后是解决方案。

问题

在后台脚本中,我想允许 localStorage 中保存的值来确定扩展程序是作为弹出窗口、新 window 还是新选项卡打开。在 window 和选项卡之间切换有效,从弹出窗口切换时除外。如果选择弹出窗口,扩展将作为弹出窗口打开。例如,当切换到新标签时,扩展程序仍会作为弹出窗口打开。新值仅在重新启动扩展后才有效。问题出在,鼓点:

chrome.browserAction.setPopup({popup: "index.html"});.

解决方案

我不确定上述问题的确切原因(我不想只说一些可能是错误的或不是 100% 准确的事情)但简单的解决方案是执行 setPopup 方法在选项卡上而不是在浏览器上。

首先,在chrome.browserAction.onClicked.addListener方法的回调函数中传入tabchrome.browserAction.onClicked.addListener(function (tab) {

Second,通过执行以下操作将 setPopup 设置为在选项卡上执行... chrome.browserAction.setPopup({tabId: tab.id, popup: "index.html"});

以上解决方案非常有效。如果有什么不清楚的,请告诉我!感谢 JamesWasson 的帮助!