#javascript #google-chrome #google-chrome-extension
#javascript #google-chrome #google-chrome-extension
Вопрос:
Я пытаюсь создать простое расширение Chrome, которое вставляет / скрывает div при переключении действия браузера (значок расширения). У меня работают основы, но я бы хотел, чтобы расширение оставалось в «включенном состоянии» (т.е. Вставленный div) при перезагрузке страницы. Его следует удалять только при выключении.
В настоящее время при каждой перезагрузке все сбрасывается.
Вот что у меня есть до сих пор:
manifest.json
{
"name": "My Extension",
"version": "0.0.1",
"manifest_version": 2,
"background": {
"scripts": ["background.js"],
"persistent": false
},
"browser_action": {
"default_icon": "icon-off.png"
},
"permissions": [
"tabs"
]
}
background.js
toggle = false;
chrome.browserAction.onClicked.addListener(function(tab) {
toggle = !toggle;
var status = 'off';
if(toggle) {
status = 'on';
}
// Toggle the icon
chrome.browserAction.setIcon({path: 'icon-' status '.png', tabId:tab.id});
// Execute script amp; pass a variable
chrome.tabs.executeScript(tab.id, {
code: 'var extension_status = "' status '";'
}, function() {
chrome.tabs.executeScript(tab.id, {file: 'inject.js'});
});
});
inject.js
// ID for inserted element
var my_div_id = 'foo';
// The div (returns null if doesn't exist)
var my_div = document.getElementById(my_div_id);
// If on for first time
if( extension_status == 'on' amp;amp; !my_div ) {
// Create div
var div = document.createElement('div');
div.id = my_div_id;
div.textContent = 'hello';
// Insert into page
document.body.appendChild(div);
}
// When toggled off hide
else if( extension_status == 'off' ) {
my_div.style.display = 'none';
}
// When Toggled back on again show again
else {
my_div.style.display = 'block';
}
Нужно ли мне передавать значение обратно в мой background.js файл? или есть лучший способ справиться с этим?
Комментарии:
1. Среди прочего, прямо сейчас ваш статус в фоновом режиме не зависит от вкладки (даже если значок, который вы установили, указан для каждой вкладки, а состояние скрипта содержимого, по необходимости, для каждой вкладки). Подумайте об этом для начала.
Ответ №1:
В конце концов я понял, что мне нужно добавить прослушиватель для chrome.tabs.onUpdated, как также указано в превосходном ответе @ViewSource. Вот последний рабочий пример:
manifest.json
{
"name": "My Extension",
"version": "0.0.1",
"manifest_version": 2,
"background": {
"scripts": ["background.js"],
"persistent": false
},
"browser_action": {
"default_icon": "icons/icon-off.png"
}
"permissions": [
"activeTab",
"<all_urls>"
]
}
background.js
var toggle = false;
var status = 'off';
var the_tab_id = '';
function set_status() {
toggle = !toggle;
status = 'off';
if(toggle) { status = 'on'; }
}
function toggle_extension(tab){
// Set icon
chrome.browserAction.setIcon({ path: 'icons/icon-' status '.png', tabId:tab.id });
// Pass variable amp; execute script
chrome.tabs.executeScript({ code: 'var extension_status = "' status '"' });
chrome.tabs.executeScript({ file: 'inject.js' });
// Set the tab id
the_tab_id = tab.id;
}
function my_listener(tabId, changeInfo, tab) {
// If updated tab matches this one
if (changeInfo.status == "complete" amp;amp; tabId == the_tab_id amp;amp; status == 'on') {
toggle_extension(tab);
}
}
chrome.browserAction.onClicked.addListener(function(tab) {
set_status();
toggle_extension(tab);
});
chrome.tabs.onUpdated.addListener(my_listener);
inject.js
if( extension_status == 'on' ) {
// do stuff
}
Ответ №2:
У меня была такая же проблема.
После перезагрузки страницы вам нужно снова переключить расширение, как вы делали, когда пользователь нажимал кнопку browserAction, только без — toggle = !toggle;
потому что пользователь не изменил состояние расширения.
Итак, как вы узнаете, когда вкладка перезагружается? использование tabs.onUpdated
Ваша новая фоновая страница должна выглядеть следующим образом:
var toggle = false;
var status = 'off';
chrome.browserAction.onClicked.addListener(function(tab) {
set_status();
toggle_extansion()
});
//add listener
chrome.tabs.onUpdated.addListener(your_listener);
function your_listener(tabId, changeInfo, tab) {
//Check that the extension should work on the updated tab
if (tab.url.search("://www.thesite.com") >-1){
//toggle the extansion as you already did
toggle_extansion();
}
}
function toggle_extansion(){
// Toggle the icon
chrome.browserAction.setIcon({path: 'icon-' status '.png', tabId:tab.id});
// Execute script amp; pass a variable
chrome.tabs.executeScript(tab.id, {
code: 'var extension_status = "' status '";'
}, function() {
chrome.tabs.executeScript(tab.id, {file: 'inject.js'});
});
}
function set_status(){
toggle = !toggle;
if(toggle) {
status = 'on';
}
}
Примечание: Нет простого способа прослушивать только вкладки, содержащие сайты совпадений в манифесте вашего расширения.
Комментарии:
1. Большое спасибо за ответ 🙂 В конце концов я понял, что мне нужно использовать прослушиватель
onUpdated
, и запутался. Ваш ответ действительно помог очистить мой код. При нажатии на расширение я устанавливаю идентификатор вкладки в качестве переменной, а затем использую его, чтобы узнать, соответствует ли обновленная вкладка. Теперь я добавил последний рабочий пример. Еще раз спасибо.