簡體   English   中英

Vaadin JavaScript卸載事件監聽器未觸發

[英]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。 我懷疑這是由於我現在解決的相關問題的副作用。

我找到了解決問題的方法。

我懷疑這個問題的大部分是通過我的其他相關問題的解決方案解決的,該問題涉及將某些代碼部分放入同步方法中。 解決此問題后,卸載方法適用於我測試過的大多數瀏覽器。 但是,Chrome仍在播放,只會在瀏覽器關閉時觸發卸載事件,而不會在關閉標簽上觸發。 添加'pagehide'監聽器似乎意味着Chrome標簽關閉現在正在正常運行。

因此, 'unload'和'pagehide'事件的組合似乎適用於所有瀏覽器 ,並且(截至目前為止 )似乎是可靠的,並且我的清理總是在用戶離開頁面時執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM