每个标签的会话 - Google Chrome扩展程序

时间:2016-11-03 09:59:50

标签: javascript google-chrome google-chrome-extension tabs

在Google Chrome扩展程序中,是否有办法为每个标签设置不同的“会话”?

例如,Adblock执行此操作:它显示当前页面的屏蔽广告数量,并且每个标签的此数字都会更改(如果您打开了2个窗口,则每个窗口都有不同的数字......)

例如,如果我使用Chrome演示更改了点击图标:

的manifest.json

{
 "name": "A browser action which changes its icon when clicked",
 "description": "Change browser action color when its icon is clicked",
 "version": "1.2",
 "background": { "scripts": ["background.js"] },
 "browser_action": {
     "name": "Click to change the icon's color"
 },
 "manifest_version": 2
}

background.js

var min = 1;
var max = 5;
var current = min;

function updateIcon() {
 chrome.browserAction.setIcon({path:"icon" + current + ".png"});
 current++;

 if (current > max)
   current = min;
}

chrome.browserAction.onClicked.addListener(updateIcon);
updateIcon();

有没有办法在每个标签上添加一些代码以使其具有不同的“范围”?例如,如果我在第一个选项卡上单击3次,它将显示icon3,如果我打开一个新选项卡,它将显示此选项卡的icon1(但仍然是第一个选项卡的icon3)

由于

1 个答案:

答案 0 :(得分:1)

chrome.browserAction API通过提供tabId作为参数来考虑标签。

例如,这里是onClicked听众的预期签名:

  

callback参数应该是一个如下所示的函数:

function( tabs.Tab tab) {...};
     

tabs.Tab tab

因此,在updateIcon函数中,您可以获取标签的ID:

function updateIcon(tab) {
  // Can use tab.id here
  /* ... */
  chrome.browserAction.setIcon({
    path:"icon" + current + ".png",
    tabId: tab.id // Limit change to tab
  });
}

当然,这意味着您必须按标签存储数据。最简单的方法是使current成为对象(或数组,但它是稀疏的) tabId的行为就像钥匙一样。

var min = 1;
var max = 5;
var current = {};

function updateIcon(tab) {
  if (!current[tab.id]) { // Not yet defined
    current[tab.id] = min;
  }

  chrome.browserAction.setIcon({
    path: "icon" + current[tab.id] + ".png",
    tabId: tab.id
  });

  if (current[tab.id] === max) {
    current[tab.id] = min;
  } else {
    current[tab.id]++;
  }
}

如果您对随时间变化的标签数据保持警惕,可以听chrome.tabs.onRemoved清除数据。

您可能还需要关注chrome.tabs.onReplaced(替换标签中的内容,更改ID)。