Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更新选项卡开关上的chrome扩展图标/更改_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript 更新选项卡开关上的chrome扩展图标/更改

Javascript 更新选项卡开关上的chrome扩展图标/更改,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我的扩展仅适用于少数网站。因此,它有一个普通图标显示在工具栏上(浏览器操作),当用户打开一个受支持的站点时,该图标应更改为另一个图标以指示它。当用户切换选项卡时也会发生同样的情况。我试着设置一个背景页面并向弹出页面发送消息,如下所示 background.js chrome.tabs.onActivated.addListener(function(tabId, changeInfo, tab) { chrome.runtime.sendMessage({msg: 'sup

我的扩展仅适用于少数网站。因此,它有一个普通图标显示在工具栏上(浏览器操作),当用户打开一个受支持的站点时,该图标应更改为另一个图标以指示它。当用户切换选项卡时也会发生同样的情况。我试着设置一个背景页面并向弹出页面发送消息,如下所示

background.js

chrome.tabs.onActivated.addListener(function(tabId, changeInfo, tab) {         
  chrome.runtime.sendMessage({msg: 'supported'});
}); 
弹出窗口

chrome.extension.onMessage.addListener(function(message, messageSender, sendResponse) {
  updateIcon();
});
但它不起作用。updateIcon()函数在从弹出页面调用时可以正常工作。我是chrome扩展开发的新手,所以我不确定我在这里做错了什么,希望能得到任何帮助。谢谢。

您可以使用内容脚本来检测受支持页面上的切换,然后通知后台页面以显示该页面的浏览器操作图标。您的内容脚本应使用
chrome.runtime.sendMessage
发送消息,后台页面应使用
chrome.runtime.onMessage.addListener进行侦听:

我创建了示例代码,并测试了它是否与我一起工作:

内容脚本:

if(onSupportedPageNeedChangeIcon) {
    // send message to background script
    chrome.runtime.sendMessage({ "newIconPath" : "newicon.png" });
}
背景页:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        // read `newIconPath` from request and read `tab.id` from sender
        //alert("good");
        chrome.browserAction.setIcon({
            path: request.newIconPath,
            tabId: sender.tab.id
        });
    });
还要记住在清单中注册内容脚本的代码,如:

"content_scripts": [
    {
      "matches": ["http://www.supportedwebsiteone.com/*", "http://www.supportedwebsitetwo.com/*"],
      "js": ["myscript.js"]
    }
  ]

您不使用页面操作有什么原因吗?这些都是为了扩展相关的只有少数几个网站。我不需要访问标签api吗?这似乎无法从内容脚本访问(不断给出未定义的错误)。另外,我还需要知道域名。简言之,扩展仅与少数域相关,但仍取决于域,将从服务器中提取不同的数据集,并表明当使用受支持的站点打开新选项卡或切换到具有受支持域的选项卡时,将显示不同的图标+标记(如在adblock/disconnect中显示标记)。在我的简单示例中,您不必访问tabs api,因为它从内容脚本发送请求,只需使用
运行时。sendMessage
:您可以在“内容\脚本”的属性“匹配”中指定域: