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

时间:2019-06-11 23:20:01

标签: javascript google-chrome manifest

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

    // 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,我将无法更新回窗口或选项卡首选项。似乎setPopup已在清单上设置,并且在从弹出窗口更改为选项卡或窗口时无法覆盖。

更新的问题: 1.有没有办法做与setPopup相反的事情? 2. setPopup是否有另一种方法?

2 个答案:

答案 0 :(得分:0)

请尝试一下,告诉我如何进行:

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

答案 1 :(得分:0)

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

问题

在后台脚本中,我想允许在localStorage中保存一个值以确定扩展名是作为弹出窗口,新窗口还是新选项卡打开。窗口和选项卡之间的切换有效,但从弹出窗口切换时除外。如果选择了弹出窗口,则扩展名将作为弹出窗口打开。例如,当切换到新选项卡时,扩展名仍将作为弹出窗口打开。新值仅在重新启动扩展名后才能起作用。问题出在请打鼓

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

解决方案

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

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

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

以上解决方案就像一个魅力。如果不清楚,请通知我!感谢 JamesWasson 的帮助!