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