Google chrome extension chrome.PageAction.hide(tabId)未按预期工作

Google chrome extension chrome.PageAction.hide(tabId)未按预期工作,google-chrome-extension,Google Chrome Extension,仅当URL等于xyz且网页具有特定的DOM元素时,我才需要显示启用的扩展图标 它看起来会很多,但实际上只是因为chrome扩展需要很多代码和文件,我认为这是一个初学者的问题,因为我是chrome扩展的新手 我试图通过在dom就绪时发送消息来解决此问题: 在我的内容脚本中- //加载时发送false chrome.runtime.sendMessage({enableIcon:false}); //*bla bla bla代码当dom就绪时,我发送消息以启用它 chrome.runtime.sen

仅当URL等于xyz且网页具有特定的DOM元素时,我才需要显示启用的扩展图标

它看起来会很多,但实际上只是因为chrome扩展需要很多代码和文件,我认为这是一个初学者的问题,因为我是chrome扩展的新手

我试图通过在dom就绪时发送消息来解决此问题:

在我的内容脚本中-

//加载时发送false
chrome.runtime.sendMessage({enableIcon:false});
//*bla bla bla代码当dom就绪时,我发送消息以启用它
chrome.runtime.sendMessage({enableIcon:true});
然后,我的BG脚本将获得消息,它将执行以下操作:

chrome.runtime.onMessage.addListener(函数(请求、发送方、发送响应){
//禁用/启用操作
showHideActionIcon(请求启用图标);
}); //留言
还有一些代码可能会有帮助

异步函数showHideActionCon(isToShow){ var tabId=(等待getCurrentTab()).id; 如果(isToShow){ console.log('showing'); chrome.pageAction.show(tabId); }否则{ log(“隐藏”); chrome.pageAction.hide(tabId); } }//showHideActionIcon 函数getCurrentTab(){ 返回新承诺((解决、拒绝)=>{ chrome.tabs.query({active:true,currentWindow:true},函数(tabs){ var currTab=tabs[0]; 如果(当前选项卡){ //找到标签,返回它 解决(currTab); }否则{ //例外! 拒绝('没有活动的选项卡:('); } });//tabs.query })新的承诺 }//getCurrentTab 最后,如果需要,我的manifast.json

{
“名称”:“确定”,
“版本”:“1.0”,
“描述”:“是的”,
“内容脚本”:[
{
“匹配项”:[“https://goodSite*"],
“js”:[“dom/main.js”]
}
],
“权限”:[
“身份”,
“活动标签”,
“选项卡”
],
“背景”:{
“脚本”:[“background/main.js”],
“持续”:假
},
“页面操作”:{
“默认_图标”:{
“128”:“images/get_started128.png”
}
},
“图标”:{
“128”:“images/get_started128.png”
},
“清单版本”:2
}
没有发生任何事情,我可以在控制台中看到“隐藏”被写入,但图标没有被禁用


我认为我做了很多错事,因为即使是我的getCurrentTab()函数有时也会被拒绝(为什么?你知道吗,忽略为什么,就在它没有被拒绝的时候,为什么我的图标没有被隐藏/禁用)

这将无法按预期工作,而且似乎是Chrome pageAction文档中的一个缺陷

您需要做的是使用
setIcon
设置禁用状态:

 chrome.pageAction.setIcon({
                tabId: tabId,
                path: "icons/dimmed.png"
            }, () => {})

ShowPageAction
的优先级高于
pageAction.hide
,因此
pageAction.hide
无法覆盖
ShowPageAction
,您需要先将其删除

移除后图标仍不会变灰,但图标的单击功能不再可用

chrome.declarativeContent.onPageChanged.removules([rules[0].id],()=>{
chrome.pageAction.hide(tabId);
});
实际上,
pageAction.hide
只对不匹配的地址起作用,匹配地址图标的颜色不会改变,但单击功能被禁用

另一种方法是设置一个灰色图标,
chrome.pageAction.setIcon
declarativeContent.setIcon

declarativeContent.SetIcon
更受推荐,因为它需要的权限更少,速度更快。
如果选择使用
declarativeContent.SetIcon
,则需要注意另一个问题(),因为这将减少您的迂回。

将sender.tab.id传递到onMessage listener中,并使用它,而不是使用chrome.tabs.query,因为内容脚本在任何匹配的选项卡中运行,而不仅仅是在活动的选项卡中。此外,您的内容脚本已经在DOM准备就绪时加载DOMContentLoaded之后运行,这是默认的时间,因此您甚至不需要disable pageAction。我认为这有点帮助,现在我总是有我的tabId,但是,chrome.pageAction.hide(tabId)没有效果。图标仍然显示并启用。我可以在控制台中看到它写“hidding”,所以它可以到达那里了……知道吗?hide()实际上并不隐藏图标,它只是使其变暗,因此您根本不需要它。您可能希望在manifest.json中指定外观不同的“default_icon”,然后使用chrome.pageAction.setIcon和show()来指定启用的图标。是的,绘制不同的图标(或在编辑器中更改原始图标的透明度)并使用setIcon()。