概念
标题提到的popup icon
其实是我自己的叫法,官方的叫法叫做action
,后边的部分我们也都用action
这种叫法。但是不管叫啥,大家知道它指的都是下面这个东西就好。
这个action
是有两个状态的,disabled
和enabled
,disabled
状态是灰色的,如下图所示。
📌 需要提醒的是
如果你的icon是黑色背景的,那么它的
disabled
和enabled
状态很难看出来区别。
到此,基础概念解释完毕,我们讲怎么改变这个状态。
问题
这个图标的状态控制有多种方式,可以通过manifest.json
中的配置来控制,也可以通过api
来控制,前者局限性较大,着重讲后者。
chrome
提供给我们控制action
的api
是chrome.action.disable
和chrome.action.enable
,参数也简单,以disable
为例:
chrome.action.disable(
tabId?: number,
callback?: function,
)
我在chrome.tabs.onActivated
事件中监听tab
变化,判断如何处理action
的状态,正常使用是没问题的,但是我发现在新开tab页的时候action应该置灰的,但是却没置灰,而且当我切换到其他tab再切回来的时候就置灰了。
分析
debug
了一下,我的chrome.action.disable
的代码确实是执行了,但是为啥没效果呢,百思不得其解,Google一通之后也没找到答案,得,得靠自己了。
将第一次打开tab和第二次切到tab的参数打出来看看。
一对比发现两次的status
是不一样的,大概明白了,当tab tab
的status
为loading
时候调用chrome.action.disable
估计是不生效的,得是status
才行。
解决
方案一
但是这个结论就很奇怪,action和tab看起来像是两个独立的模块,为啥action会受tab的影响。仔细看了chrome.action.disable
的调用参数发现,哦,原来我们传了tabId
过去,可能是这个参数的原因吧,但是再仔细一看,这个参数是可选的,那我们不传是不是就避免这两者之间产生关联了,尝试了下发现果然可以,这里传tabId
的意思是为某个tab
设置action
状态,那么不传的话便是为所有tab
设置action
状态。但实际上同一时间处于actived
的tab
只会有一个,所以传与不传影响都不大。
所以不传tabId,这是一种解决办法,但是如果你坚持要传tabId的话,还有一种解决办法:
方案二
chrome.tabs
有一个onUpdate
事件,你可以通过监听这个事件,在tab
的status == "complate"
的时候再调用一下disable
方法。
chrome.tabs.onUpdated.addListener(function (tabId, { status }, tab) {
if (status === "complete") {
chrome.action.disable(tabId);
}
});
这两种办法都可以解决问题,具体使用看你的选择。
至此,问题解决。
EOF.