Javascript 每个选项卡的会话-Google Chrome扩展

Javascript 每个选项卡的会话-Google Chrome扩展,javascript,google-chrome,google-chrome-extension,tabs,Javascript,Google Chrome,Google Chrome Extension,Tabs,在GoogleChrome扩展中,有没有一种方法可以为每个标签设置不同的“会话” 例如,Adblock就是这样做的:它显示当前页面被阻止的广告的数量,每个选项卡的数量都会发生变化(如果打开了两个窗口,每个窗口的数量也会不同……) 例如,如果我使用Chrome演示在单击时更改图标: manifest.json { "name": "A browser action which changes its icon when clicked", "description": "Change brow

在GoogleChrome扩展中,有没有一种方法可以为每个标签设置不同的“会话”

例如,Adblock就是这样做的:它显示当前页面被阻止的广告的数量,每个选项卡的数量都会发生变化(如果打开了两个窗口,每个窗口的数量也会不同……)

例如,如果我使用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)

感谢

通过提供并将
tabId
作为参数来考虑选项卡

例如,这里是一个点击的
监听器的预期签名:

回调参数应该是如下所示的函数:

function( 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
  });
}
当然,这意味着您必须在每个选项卡上存储数据。最简单的方法是使用
tabId
作为键将
current
设置为对象(或数组,但它将是稀疏的)

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)。

太棒了,谢谢!我开始看页面动作,而不是浏览动作,但我被它卡住了。。。你的解决方案要简单得多,因为谷歌的页面操作完全是浏览器操作的低级版本,因为它们不再只能显示在相关页面上。他们甚至告诉“请考虑使用浏览器动作来代替,这样用户就可以在文档中正确地与扩展”进行交互。