通过浏览器操作/图标禁用/启用Chrome扩展程序

9
我正在开发的Chrome扩展程序在每个网站页面上插入内容脚本和CSS。但是,用户可能有某些页面不希望该扩展程序运行,因此如果我可以将浏览器动作设置为基本的开/关切换,那将非常好。
我想做的事情类似于这样:
chrome.browserAction.onClicked.addListener(function(tab) {

    //IF ENABLED THEN DISABLE

    //IF DISABLED THEN ENABLE

} 

任何帮助都将不胜感激!
2个回答

6

没有提供这样的API。但是有两种可能的解决方法:

I. 您可以使用“禁用”标志变量,并从您的后台页面更新它。

后台页面:

function disableExtension(disabled)
{
    chrome.windows.getAll({populate : true}, function (window_list)
    {
        for (var i = 0; i < window_list.length; ++i)
        {
            var window = window_list[i];
            for (var j = 0; j < window.tabs.length; ++j)
            {
                var tab = window.tabs[j];
                if (checkContentScriptExists(tab))
                {
                    chrome.tabs.executeScript(tab.id, {code : "disabled = " + disabled + ";"}, allTabs: true) 
                }
            }
        }
        // No matching url found. Open it in the new tab
        chrome.tabs.create({ url : url, selected: true });
    });
}

内容脚本应该在运行之前检查条件。

if (!disabled) doSomething();

II. 一种备受争议的方法,用于保存背景页面内容中的禁用变量

背景页面:

function disableExtension(disabled)
{
    global.disabled = disabled;
}
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.msg == "getDisabled") {
        sendResponse({disabled: global.disabled});
        return true;
    }
});

在执行之前,内容脚本应查询当前禁用状态。

chrome.runtime.sendMessage({msg: "getDisabled"}, function(response) {
   if (!response.disabled) doSomething();
});

你能解释一下为什么“II”是有争议的吗?(我会将它存储在“storage”中而不是“global”,但这似乎是一个好的方法) - nez
因为它会给内容脚本代码增加额外的复杂性。我现在不确定存储情况。至少在回答撰写时,它还没有在内容脚本中可用。 - Andrey
2
在II中复制/粘贴第二个代码片段无法正常工作,因为有一个拼写错误:getDiasbled。无法改进帖子,因为至少需要更改6个字符。 - user8472

-2

Chrome扩展程序有自己的API。您可以通过内容脚本调用它们。不确定是否可以通过任何第三方JS调用它们。请参考this ink

希望能帮到您。


我可以通过这种方式将CSS和JS注入到页面中,但这需要用户每次想要将扩展的代码应用于网站时都要点击浏览器操作图标。我希望扩展程序始终应用CSS / JS,除非他们将其切换为“关闭”,然后在切换回“打开”之前永远不应用它。 - TyGoss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接