Продолжайте запускать расширение Chrome при перезагрузке страницы

#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 , и запутался. Ваш ответ действительно помог очистить мой код. При нажатии на расширение я устанавливаю идентификатор вкладки в качестве переменной, а затем использую его, чтобы узнать, соответствует ли обновленная вкладка. Теперь я добавил последний рабочий пример. Еще раз спасибо.