【问题标题】:Disable Extension on clicking the icon单击图标时禁用扩展
【发布时间】:2015-10-08 14:44:09
【问题描述】:

我正在尝试编写一个 Chrome 扩展程序,只需单击浏览器操作图标即可禁用该扩展程序。我想给用户这个选项,因为当警报被触发时,扩展会引发一个 javascript 警报。问题是,即使在清除警报之后,我仍然看到警报被发出。此外,我想用作开关的图标点击也没有按预期工作。

我已在 manifest.json 中将 background.js 声明为我的背景 javascript 文件

"background": {
    "scripts": ["alert.js"],
    "persistent": true
},
"browser_action": {
    "default_icon": "images/green.png",
    "default_action": "popup.html",
    "default_title": "Toggle Productiwitty"
}

background.js

var ExtensionOn = true;

function SwitchOn(e)
{
    chrome.alarms.create("Alarm", {delayInMinutes: 0.1, periodInMinutes: 1} );
}

function SwitchOff(e) 
{
    chrome.alarms.clear("Alarm");
}

function showpopup()
{
    alert("Inside function showpopup");
    console.log("alert shown");
}

function click(e)
{
    if(ExtensionOn)
    {
        SwitchOff();
        console.log("switched off");
        chrome.browserAction.setBadgeText({text: "Off"});
    }
    else if(!ExtensionOn)
    {
        SwitchOn();
        console.log("switched on");
        chrome.browserAction.setBadgeText({text: "ON"});
        // Replace 15.0 with user selected time in minutes  
    }
    //Toggle ExtensionOn
    ExtensionOn = ~ ExtensionOn;
}

if(ExtensionOn)
{
    chrome.alarms.onAlarm.addListener(showpopup);
}
chrome.browserAction.onClicked.addListener(click);

我的 "default_action": "popup.html" 调用 popup.js 来创建警报

chrome.alarms.create("Alarm", {delayInMinutes: 0.1, periodInMinutes: 1} );

这个想法是,一旦加载了扩展程序,它应该每 1 分钟显示一个弹出窗口,如果您单击该图标,该扩展程序将被暂时禁用。再次单击该图标时,将定期发出相同的警报。

【问题讨论】:

  • “禁用扩展”不同于“单击浏览器操作来切换行为”。
  • @Teepeemm 从技术上讲,切换功能正在禁用它。当您想要关闭扩展程序时,在开发人员选项中,取消选中启用按钮。所以启用的反义词是禁用。建议一个更好、更相关的标题,我会编辑我的帖子:)
  • 你为什么要使用持久的背景页面?
  • chrome://extensions 中的复选框将启用或禁用扩展。在浏览器操作上具有二进制行为是完全不同的。如果你仔细想想,你并不是真的试图“禁用”任何东西。您真的希望浏览器操作有两种不同的结果。碰巧这些结果之一没有做任何事情。因此,我将其称为与“禁用”扩展程序不同的事情。
  • @DanielHerr:活动页面在这里更有意义吗?我是 Chrome 扩展程序开发的新手。

标签: javascript google-chrome google-chrome-extension


【解决方案1】:
ExtensionOn = true
> true
ExtensionOn = ~ ExtensionOn
> -2
Boolean(ExtensionOn)
> true

如果要切换布尔值,请使用 !,而不是 ~

if(ExtensionOn)
{
    chrome.alarms.onAlarm.addListener(showpopup);
}

这只会在页面首次加载时调用一次。如果此时扩展未开启,则不会添加侦听器,并且永远不会调用该函数。我建议将 if 测试移至 showpopup

【讨论】:

  • 在 showpopup 函数中添加 if 子句似乎已经解决了问题。但是,我不再收到警报的原因是,如果 ExtensionOn 变量设置为 false,我不会显示警报,但警报尚未清除并且仍在占用内存。此外,如果没有 showpopup 中的 if 子句,同样的问题仍然存在。谢谢!建议。
  • @Piyush else if (!ExtensionOn) 如果你还有~ 就不会发生,因为ExtensionOn 将是1 或-2,其中任何一个都是真实的。但你甚至不需要它;只需使用else,因为您想要一个或另一个分支。
  • 有道理。已将 else if 替换为 else 和 ~ 替换为 !。但是,当 ExtensionOn = false 时仍显示弹出窗口,而 showpopup() 函数中没有 if(ExtensionOn) 条件。我将答案标记为已接受,因为它正在工作。但是,单击扩展图标时,我无法清除警报。这里的目标是单击图标并清除警报,然后再次单击图标并生成新警报。
  • 我无法理解您现在的代码是什么。我唯一能想到的就是利用您在这里学到的知识并创建一个新问题(可能会参考这个问题)。 (请不要编辑当前问题,使我们所做的帮助变得多余。)
【解决方案2】:

来自https://developer.chrome.com/extensions/management#method-setEnabled

chrome.management.setEnabled(ExtId, true/false, callback)

但我不确定禁用扩展是你真正想要做的, 禁用后,您必须转到 chrome://extension 并手动重新启用它。

【讨论】:

  • 如果您曾经使用过 Adblock 扩展程序,您可以选择单击它来禁用该扩展程序,然后您可以单击它以使其再次工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2021-07-09
  • 2018-06-08
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多