2014-10-06 199 views
2

我有一個js更改事件,它在用戶離開控件時通過Ajax請求保存數據。這工作正常,除非用戶決定離開頁面。 Ajax然後沒有完成,數據也沒有保存。看我Ajax request with JQuery on page unload我看到,如果我使請求同步Ajax請求將完成。我試過這個,它確實有效。但是,每當用戶從控件移動到頁面上的控件時,我都會調用此更改事件,並且我不希望所有這些調用都是同步的。在離開頁面之前獲取Ajax請求完成

我試着用Alert for unsaved changes in form來檢查未保存的數據。當存在未保存數據的控件時,這會觸發beforeunload函數正常工作,但是我無法確定beforeunload函數中要放置什麼。

  • 我可以提醒一下。當用戶取消警報時,我的更改代碼將運行並且一切正常。然而,當用戶保存正常的數據而不需要做任何事情時,彈出一個對話框令人討厭和困惑
  • 我試圖Using jQuery to test if an input has focus找到有焦點的元素,然後強制我的更改函數運行這個。然而,我找不到有焦點的元素(可能在這裏做錯了什麼?)
  • 我試過使用睡眠功能給Ajax調用時間運行,但沒有工作
  • 我試過將焦點設置到另一個控件 - 沒有運氣

任何關於我可能會嘗試什麼或者我可能會做什麼錯誤的想法我試過的任何事情?我能以某種方式發出無形警報,並且在用戶不必做任何事情的情況下觸發並取消警報?

+2

由於很好的理由,沒有可靠的方法來做到這一點:如果一個Ajax請求可能導致瀏覽器在離開頁面之前等待,那麼一個聰明的網站可能無法無限期地離開該頁面的時間。這可能,也會被不良演員濫用。 Izzey的建議很好。設計你的應用程序的假設是用戶可以在任何時候離開,或者他們的互聯網連接可能會丟失。閱讀[Offline First!](http://offlinefirst.org/)以獲取更多最佳實踐。 – 2014-10-06 19:04:22

回答

1

觸發一個單獨的Ajax調用是在卸載功能同步。通過這種方式,當頁面卸載時,第二個AJAX調用(即阻塞)將觸發,並且該頁面不會卸載直到保存完成,並且原始的異步AJAX調用將保留用於頁面的其餘部分

+0

我試着創建一個單獨的同步調用,但在保存期間我做了多個Ajax調用,第一個檢查重複值,第二個調用保存數據。我可以跑第一跑,但不是第二跑。 – 2014-10-07 13:04:13

+0

您是否在保存爲同步呼叫期間進行了兩個呼叫?如果你不想這樣做,你可以用jQuery回調鏈接它們,在第一次調用成功時執行第二次調用。 – Mark 2014-10-07 13:05:45

+0

是的調用是在jQuery回調中,但它調用一個然後到下一個,不執行調用。我會再看一眼,看看我能看到發生了什麼。 – 2014-10-07 13:10:03

3

當用戶離開頁面時,保存數據的唯一好方法是連續不斷地保存數據(localStorage),並在用戶離開頁面時未將數據保存到服務器時提醒用戶。 localStorage的好處在於,即使計算機崩潰或連接丟失,數據也會保存到瀏覽器中。當用戶重新連接時,您可以將數據同步回服務器。
更多關於離線瀏覽器存儲:
https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage
http://diveintohtml5.info/storage.html

+0

這聽起來不錯,但是現在可能需要進行過多的重寫。長遠來說,我計劃建立一個我的網站的離線版本..但是,這將不得不等待。 – 2014-10-07 13:03:37

相關問題