2016-11-03 4 views
1

В расширенном расширении Google Chrome существует ли способ иметь разные «сеансы» для каждой вкладки?Сессия для каждой вкладки - Расширение Google Chrome

Например, Adblock делает это: он показывает количество заблокированных объявлений для текущей страницы, и этот номер изменяется для каждой вкладки (и если у вас открыто 2 окна, другое число для каждого окна ...)

для Exemple, если я использую демо 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(); 

Есть ли способ добавить некоторый код, чтобы иметь другую «область» на каждой вкладке? Для Exemple, если я нажимаю 3 раза на первую вкладке, было бы показать icon3, и если я открываю новую вкладку, было бы показать icon1 на эту вкладку (но по-прежнему icon3 для первой вкладки)

Благодарностью

ответ

1

chrome.browserAction API принимает во внимание вкладки, предоставляя и принимая в качестве параметра tabId.

Например, вот ожидаемый сигнатура onClicked слушателя:

Параметр обратного вызова должен быть функцией, которая выглядит следующим образом:

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

tabs.Tabtab

Так , в вашей функции updateIcon вы можете получить идентификатор вкладки:

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 (который заменяет содержимое на вкладке, изменяя идентификатор).

+0

Awesome, спасибо! Я начал смотреть на pageAction вместо browserAction, но я застрял на нем ... ваше решение стало проще, но – Timtest

+0

В [текущей парадигме Google] (https://groups.google.com/a/chromium.org/d/msg/chromium-extensions/7As9MKhav5E/dNiZDoSCCQAJ) Действия страницы - это строго худшие версии действий браузера, поскольку они больше не могут отображаться только на соответствующих страницах. Они даже говорят: «Пожалуйста, подумайте об использовании действия браузера, чтобы пользователи всегда могли взаимодействовать с вашим расширением» _ прямо в документации. – Xan

Смежные вопросы