Chrome插件disable popup icon(action)不生效的解决办法

101 阅读2分钟

概念

标题提到的popup icon其实是我自己的叫法,官方的叫法叫做action,后边的部分我们也都用action这种叫法。但是不管叫啥,大家知道它指的都是下面这个东西就好。

截屏2024-10-25 17.41.29.png

这个action是有两个状态的,disabledenableddisabled状态是灰色的,如下图所示。

📌 需要提醒的是

如果你的icon是黑色背景的,那么它的disabledenabled状态很难看出来区别

截屏2024-10-25 17.42.55.png截屏2024-10-25 17.43.51.png

到此,基础概念解释完毕,我们讲怎么改变这个状态。

问题

这个图标的状态控制有多种方式,可以通过manifest.json中的配置来控制,也可以通过api来控制,前者局限性较大,着重讲后者。

chrome提供给我们控制actionapichrome.action.disablechrome.action.enable,参数也简单,以disable为例:

chrome.action.disable(
  tabId?: number,
  callback?: function,
)

我在chrome.tabs.onActivated事件中监听tab变化,判断如何处理action的状态,正常使用是没问题的,但是我发现在新开tab页的时候action应该置灰的,但是却没置灰,而且当我切换到其他tab再切回来的时候就置灰了。 屏幕录制2024-10-25 18.04.07.gif

分析

debug了一下,我的chrome.action.disable的代码确实是执行了,但是为啥没效果呢,百思不得其解,Google一通之后也没找到答案,得,得靠自己了。 将第一次打开tab和第二次切到tab的参数打出来看看。

截屏2024-10-25 18.22.13.png

截屏2024-10-25 18.22.24.png

一对比发现两次的status是不一样的,大概明白了,当tab tabstatusloading时候调用chrome.action.disable估计是不生效的,得是status才行。

解决

方案一

但是这个结论就很奇怪,action和tab看起来像是两个独立的模块,为啥action会受tab的影响。仔细看了chrome.action.disable的调用参数发现,哦,原来我们传了tabId过去,可能是这个参数的原因吧,但是再仔细一看,这个参数是可选的,那我们不传是不是就避免这两者之间产生关联了,尝试了下发现果然可以,这里传tabId的意思是为某个tab设置action状态,那么不传的话便是为所有tab设置action状态。但实际上同一时间处于activedtab只会有一个,所以传与不传影响都不大。 所以不传tabId,这是一种解决办法,但是如果你坚持要传tabId的话,还有一种解决办法:

方案二

chrome.tabs有一个onUpdate事件,你可以通过监听这个事件,在tabstatus == "complate"的时候再调用一下disable方法。

chrome.tabs.onUpdated.addListener(function (tabId, { status }, tab) {
    if (status === "complete") {
      chrome.action.disable(tabId);
    }
});

这两种办法都可以解决问题,具体使用看你的选择。

至此,问题解决。

EOF.