[英]Vaadin JavaScript unload event listener not firing
我有一個Vaadin 7應用程序,我需要可靠地檢測用戶離開或導航離開頁面以執行一些清理。
我的目標是讓頁面彈出一個關閉瀏覽器/選項卡的確認對話框,如果用戶選擇離開頁面,那么我在那時執行清理操作。
我對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'偵聽器,但不會觸發'unload'偵聽器:
JavaScript.getCurrent().execute(
"function closeListener() { catchClose(); } " +
"window.addEventListener('beforeunload', closeListener); " +
"window.addEventListener('unload', closeListener);"
);
所以我的問題是,“卸載”聽眾不能解雇的原因是什么? 這種方法是一種執行清理操作的好方法嗎?
注意:下面是我在網頁關閉時清理操作的函數回調,以防對'unload'監聽器產生任何影響。 我根本沒有打印出來,所以這意味着沒有調用“catchClose”函數。
JavaScript.getCurrent().addFunction("catchClose", arguments -> {
System.out.println("catchClose callback from " + Page.getCurrent().getWebBrowser().getBrowserApplication());
presenter.webPageClosed();
});
編輯:通過進一步的調查,實際看起來好像卸載方法偶爾會正確啟動,但我無法確定它何時以及為什么會這樣做。 另外,我發現如果我在“closeListener”函數中放置一個斷點,它會被調用,我的卸載工作絕對正常。
編輯:對我來說,它現在看起來好像代碼適用於Safari,Firefox和Opera,但不適用於Chrome。 我懷疑這是由於我現在解決的相關問題的副作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.