【问题标题】:Session for each tab - Google Chrome Extension每个选项卡的会话 - Google Chrome 扩展程序
【发布时间】:2016-11-03 09:59:50
【问题描述】:

在 Google Chrome 扩展程序中,有没有办法为每个选项卡设置不同的“会话”?

例如,Adblock 就是这样做的:它显示当前页面被阻止的广告数量,并且这个数字会随每个标签页而变化(如果您打开了 2 个窗口,则每个窗口的数字都不同...)

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

ma​​nifest.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)

谢谢

【问题讨论】:

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


    【解决方案1】:

    chrome.browserAction API 通过提供和采用tabId 作为参数来考虑制表符。

    例如,这是onClicked 侦听器的预期签名:

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

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

    tabs.Tabtab

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

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

    当然,这意味着您必须按标签存储数据。 最简单的方法是使用 tabIdcurrent 设为对象(或数组,但会很稀疏) s 就像钥匙一样。

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

    【讨论】:

    • 太棒了,谢谢!我开始看 pageAction 而不是 browserAction,但我被困在它上面......虽然你的解决方案更容易
    • 在 Google 的 current paradigm 中,页面操作严格来说是浏览器操作的劣质版本,因为它们不再只能显示在相关页面上。他们甚至在文档中告诉“请考虑使用浏览器操作,以便用户始终可以与您的扩展程序交互”
    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多