在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)
由于
答案 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)。