У меня есть приложение Vaadin 7, где мне нужно надежно обнаружить пользователя, уходящего или перемещающегося от страницы, чтобы выполнить некоторую очистку.Vaadin JavaScript разгружает прослушиватель событий не работает
Моя цель состоит в том, чтобы страница открыла диалоговое окно подтверждения при закрытии браузера/вкладки, и если пользователь решил оставить страницу, то в этот момент я выполняю операцию очистки.
Я довольно неопытный в JavaScript, но из того, что я обнаружил, «onbeforeunload» и «onunload» - это функции, которые нужно использовать.
На данный момент я использую следующий код, когда я вхожу страницу:
JavaScript.getCurrent().execute(
"beforeCloseListenerGlobal = function beforeCloseListener (e) {\nvar e = e || window.event;\nvar message = " + LEAVE_PAGE_MESSAGE + ";\nif(e) e.returnValue = message;\nreturn message;\n};\n" +
"closeListenerGlobal = function closeListener() {\ncatchClose();\n};\n" +
"addCloseListenersGlobal = function addCloseListeners() {\nwindow.addEventListener('beforeunload', beforeCloseListenerGlobal);\nwindow.addEventListener('unload', closeListenerGlobal);\n};\n" +
"removeCloseListenersGlobal = function removeCloseListeners() {\nwindow.removeEventListener('beforeunload', beforeCloseListenerGlobal);\nwindow.removeEventListener('unload', closeListenerGlobal);\n};"
);
Затем, когда я нажимаю кнопку «Пуск» на мой интерфейс для запуска операции:
JavaScript.getCurrent().execute("addCloseListenersGlobal();");
Когда я перехожу от моей веб-страницы, закрывая вкладку, например, я получаю всплывающее окно подтверждения, как и хочу. Однако, если я нажму «Да», страница закрывается, но мое событие «разгрузки» не срабатывает. Когда я нажимаю соответствующую кнопку «Стоп», очистка работает правильно, поэтому я знаю, что эта часть в порядке.
Из того, что я прочитал, основные браузеры поддерживают onunload (я пробовал Firefox, Chrome, Safari и Opera). Более интересно, если я использую следующий код, а затем мои closeListener пожары на «beforeunload» слушателя, но не на «разгрузочного» слушателя:
JavaScript.getCurrent().execute(
"function closeListener() { catchClose(); } " +
"window.addEventListener('beforeunload', closeListener); " +
"window.addEventListener('unload', closeListener);"
);
Так что мой вопрос, что может быть причиной для «разгрузить» слушателя не стрелять? Является ли этот метод хорошим и надежным способом выполнения операции очистки?
Примечание: ниже приведена моя функция обратного вызова функции очистки на веб-странице, в случае, если это повлияет на прослушиватель «разгрузить». Я вообще не печатаю, поэтому подразумевается, что функция catchClose не вызывается.
JavaScript.getCurrent().addFunction("catchClose", arguments -> {
System.out.println("catchClose callback from " + Page.getCurrent().getWebBrowser().getBrowserApplication());
presenter.webPageClosed();
});
Edit: Через дальнейшего расследования он на самом деле кажется, будто метод выгрузить очень редко делает огнь правильно, хотя я не могу точно определить, когда и почему он делает это только пока. Кроме того, я обнаружил, что если я поставлю точку останова внутри моей функции «closeListener», она будет вызвана, и моя разгрузка работает абсолютно нормально.
Редактировать: для меня теперь выглядит так, как если бы код работал для Safari, Firefox и Opera, но не для Chrome. Я подозреваю, что это связано с побочным эффектом от my related question, который я сейчас разрешил.