Включает ли onbeforeunload триггер события popup.html в расширении google chrome?

Я пишу расширение google chrome со всплывающей и фоновой страницей. Всплывающее окно подписывается на определенные события, которые генерирует фон, и я хотел бы отказаться от подписки на эти события, когда всплывающее окно исчезнет. Однако я не вижу, чтобы из всплывающего окна генерировались события onbeforeunload или onunload. Эти события уволены? Если нет, какие-либо идеи о том, как закрыть всплывающее окно?

Ответы

Ответ 1

"beforeunload" не, запущен для всплывающих окон действия браузера. Поверь мне, я попробовал. "Выгрузка" должна быть запущена правильно, однако, послушайте это.

На самом деле, у меня есть аналогичная система, позволяющая присоединять события с помощью addEventListener, и они автоматически очищаются при возникновении события разгрузки.

Вот немного подсказки: очевидно, вы не можете использовать console.log, потому что к тому времени, когда срабатывает событие разгрузки, это уже слишком поздно. Но вы можете это сделать:

var background = chrome.extension.getBackgroundPage();

addEventListener("unload", function (event) {
    background.console.log(event.type);
}, true);

Используя приведенный выше код, вы можете открыть консоль фоновой страницы, которая должна показать, что событие разгрузки запущено правильно.

Ответ 2

У меня была подобная проблема. В моем случае я сосредоточил внимание на элементе, который был на всплывающей странице. Поэтому, когда всплывающее окно закрыто, элемент теряет фокус, и я могу поймать событие размытия.

Ответ 3

Если вы переключились на использование страниц событий вместо фоновых страниц в своем расширении, рекомендуемым способом получения доступа к нему является вызов chrome.runtime.getBackgroundPage() с функцией, которая получает обратный вызов с ссылкой на справочную страницу.

Однако, если вы попытаетесь получить фоновый рисунок в обработчике onbeforeunload, например:

document.addEventListener("beforeunload", function() {
    chrome.runtime.getBackgroundPage(function(backgroundPage) {
        backgroundPage.log("unloading");
    });
});

Обратный вызов, похоже, не срабатывает до выгрузки страницы, поэтому вызов log() никогда не выполняется.

В приведенном выше комментарии Пауан предложил использовать chrome.extension.getBackgroundPage() для получения страницы. Единственный способ, с помощью которого я мог работать, заключался не в создании обработчика с addEventListener(). Вместо этого мне пришлось пойти в старую школу и установить обработчик непосредственно на window:

window.onbeforeunload = function() {
    chrome.extension.getBackgroundPage().log("unloading");
};

Это, наконец, дошло до фоновой страницы.