如何为chrome上的每个标签获取不同的徽章值?

Jak*_*dor 6 javascript jquery dom google-chrome google-chrome-extension


我正在尝试做像adblock这样的事情.Adblock计算"广告"的数量并更新徽章价值.目前,我尝试使用"背景页面"执行某些操作,但它们只运行一次,并且所有选项卡的徽章值都相同.我无法使用浏览器操作popup.html,因为它只在点击后触发.
所以我需要一些带有当前标签的东西,能够读取当前选项卡的DOM以及所有更新徽章值.但是,在我点击不同的标签后,我需要计算新的徽章价值.
提前致谢

wOx*_*xOm 12

如果您指定了tabId参数,则会为每个选项卡单独存储徽章文本,如果您已设置了值,则无需在用户切换选项卡后手动更新徽章文本.

因此,如果您的扩展程序在加载后立即处理页面,请调用chrome.browserAction.setBadgeText一次.您可以通过将内容脚本中的消息发送到后台/事件页面来执行此操作setBadgeText,该页面将使用发件人选项卡的ID进行调用(此参数使文本对选项卡唯一).

可能有一个问题:预呈现(不可见)选项卡无法分配徽章文本,因此您必须推迟更新,这是使用制表符webNavigation API 的示例:

内容脚本:

chrome.runtime.sendMessage({badgeText: "123"});
Run Code Online (Sandbox Code Playgroud)

背景/事件脚本:

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    if (message.badgeText) {
        chrome.tabs.get(sender.tab.id, function(tab) {
            if (chrome.runtime.lastError) {
                return; // the prerendered tab has been nuked, happens in omnibox search
            }
            if (tab.index >= 0) { // tab is visible
                chrome.browserAction.setBadgeText({tabId:tab.id, text:message.badgeText});
            } else { // prerendered tab, invisible yet, happens quite rarely
                var tabId = sender.tab.id, text = message.badgeText;
                chrome.webNavigation.onCommitted.addListener(function update(details) {
                    if (details.tabId == tabId) {
                        chrome.browserAction.setBadgeText({tabId: tabId, text: text});
                        chrome.webNavigation.onCommitted.removeListener(update);
                    }
                });
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

  • [提供](https://developer.chrome.com/extensions/browserAction#method-setBadgeText)指定`tabId`参数.我在答案中添加了一个更明显的澄清. (2认同)