2009-06-02 74 views
25

我有一些(可能)長期運行的ajax調用,如果用戶導航到另一個頁面,我想中止。在導航離開該頁面下面的jQuery代碼調用的所有未決的XMLHttpRequest對象中止:瀏覽器等待ajax調用完成,即使中止已被調用(jQuery)

$.ajaxSetup({ 
    beforeSend: function(xhr) { 
     $(window).bind('beforeunload', function() { 
      xhr.abort(); 
     }); 
    } 
}); 

在測試情況下,我強迫在服務器端運行一個10秒的等待被調用。使用Firebug,我確認上述代碼確實會導致所有掛起的Ajax調用立即停止,當我點擊頁面上的任何鏈接時。但是,瀏覽器仍然等待整整10秒鐘,然後再進入下一頁。 IE似乎表現出相同的行爲。這是一個已知的瀏覽器行爲?在這種情況下,我能做些什麼讓用戶立即離開頁面?提前致謝。

+0

Ajax調用是什麼樣的? – epascarello 2009-06-02 22:53:20

回答

27

謝謝您的回覆!事實證明,我對這是一個瀏覽器問題完全錯誤 - 問題出在服務器上。 ASP.NET對需要會話狀態的同一個會話的請求進行序列化,因此在這種情況下,下一個頁面在服務器上沒有開始處理,直到完成那些由ajax發起的請求。

不幸的是,在這種情況下,在響應ajax調用的http處理程序中需要會話狀態。但只讀訪問是足夠好的,所以通過使用IReadOnlySessionState而不是IRequiresSessionState標記處理程序,會話鎖定不會被保留,問題就解決了。

希望這些信息對其他人有用。

+2

我有這樣的頭痛,非常感謝! – Pablo 2010-08-25 01:49:52

+0

您有任何參考資料可以更詳細地解釋這一點嗎? – Phil 2014-09-22 23:47:32

+0

@Phil,我在這裏找到了關於ASP.NET這個問題的更多信息:http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/ – 2015-05-21 21:09:32

2

您確定您使用的是異步請求嗎?如果整個申請過程中的瀏覽器攔截,您使用的是同步的請求(async參數爲false)

+0

服務器實際上是拖延導航,因爲它想要導航到的頁面使用與正在運行並持續到會話的AJAX請求相同的會話。 – grantwparks 2017-10-27 23:29:28

3

你可能要檢查中止的)一個奇怪的副作用(

當abort()方法readystatechange事件在資源管理器和Mozilla中觸發。更糟的是,readyState = 4,這意味着平均xmlhttp腳本假定數據已正確加載。這會產生非常奇怪的效果。

這裏記載:

http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html

1

服務器問題也是我正在使用的Apache/Php服務器的情況。刪除了不需要它的腳本的session_start(AJAX),並且所有內容都按預期工作。 感謝託德指出了一個類似的問題!

9

關於託德自己回答這個問題......

我只是用PHP和同解會工作這個問題。不過,我需要會議中的信息。對於PHP開發人員,您可以致電session_write_close()在請求中間關閉並寫出會話。這將釋放其他請求的會話。