Вызывает ли событие onbeforeunload для popup.html в расширении Google Chrome? - PullRequest
17 голосов
/ 23 февраля 2010

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

Ответы [ 3 ]

31 голосов
/ 01 октября 2010

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

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

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

var background = chrome.extension.getBackgroundPage();

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

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

1 голос
/ 18 апреля 2010

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

0 голосов
/ 09 ноября 2017

Если вы переключились на использование страниц событий вместо фоновых страниц в своем расширении, рекомендуемый способ получить к нему доступ - вызвать 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");
};

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

...