2010-02-22 82 views
3

我是一個初學者,使用ajax,我一直認爲它是完全異步的。但是我發現一個呼叫可能會因頁面重新加載或頁面更改而中斷(如單擊超鏈接)。我的印象是,當ajax調用開始時,無論瀏覽器做什麼,它都會被執行。那是錯的嗎?呼叫被頁面加載中斷

現在我遇到的具體問題是:想到用戶回答問題的在線測試(通過在文本框中鍵入)。當文本框失去焦點時,觸發ajax調用,將文本框的值保存到數據庫中。在文本框之間切換時效果很好。不過,我也有一個提交按鈕,它將一個發佈操作觸發到另一個頁面(這是提交按鈕)。當我在文本框中輸入內容並在之後點擊該按鈕時,不會執行呼叫。此外,當我輸入一個文本框,點擊其他地方(也觸發該調用),並迅速點擊提交按鈕,呼叫也沒有。那是預期的行爲?

我首先使用ajax的原因是爲了保持這些值,所以當發生不可預測的事情時,比如瀏覽器崩潰,已經輸入的文本已經保存。

我的思維方式錯了嗎?你將如何去解決這個問題?

謝謝你的時間!

+0

好問題! –

回答

1

除非您使用持久本地存儲做一些特殊的事情,否則當新頁面加載到當前頁面時,所有javascript和ajax調用都會被吹走。當提交表單完成時。

要保存頁面內的內容,請儘快保存數據。例如,或許可以通過定時器週期性地保存密鑰,而不僅僅是失去焦點。

重新提交頁面:將點擊行爲更改爲首先存儲,然後轉到新頁面。

你看到的所有效果都是正常的。

另外,一定要測試在兩個慢(即6或7)和快速瀏覽器(鉻)

2

AJAX 異步的。

當您發送AJAX請求時,JavaScript引擎將其發送出去並設置響應處理程序。

但是,如果您向服務器發送AJAX請求,然後在收到頁面之前離開頁面,則不會發生任何事情。爲什麼?因爲每次頁面加載時,整個Javascript環境都被撕下並重新初始化,它不知道最後一頁上發生了什麼。

對於你的問題,我會攔截表單提交行爲並做任何你需要處理的數據,然後然後提交表單。

編輯:回覆您的評論。你是對的。如果發送了ajax請求,並且不依賴於它的返回值,那麼它應該沒有關係。

我建議用Firebug調試您的問題,看看是否AJAX調用是真的被正確發送,並確認您的服務器已正確處理它。

+1

但在這個例子中,我不在乎返回值。無論如何,服務器不會發回任何東西。 我對(真正)異步的理解是,只要調用「調度」,它就會通向服務器,不會被瀏覽器/用戶中斷。但是當我閱讀你的答案時,似乎JavaScript以某種方式阻止呼叫以便能夠中斷它。但是,多久,爲什麼? –