1

У меня есть приложение 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, который я сейчас разрешил.

ответ

0

Я нашел решение своей проблемы.

Я подозреваю, что большая часть этой проблемы была решена с помощью решения my other related issue, которое включало некоторые части кода в синхронные методы. После исправления этой проблемы метод выгрузки работал в большинстве браузеров, на которых я тестировал. Тем не менее, Chrome все еще проигрывал и только запускал событие разгрузки в браузере, а не на закрытии вкладки. Добавление в прослушиватель 'screenhide', похоже, означает, что закрытие вкладки Chrome теперь действует соответствующим образом.

Так, сочетание «разгрузить» и «pagehide» событий, кажется, работает во всех браузерах, и (как сейчас для меня), как представляется, быть надежным, и моя очистка всегда выполняется, когда пользователь покидает стр.