最近公司項目需要,做瞭一些web im的研究,在demo測試的過程中發現瞭以下3個問題:
1、請求不間斷的長輪詢,在IE下頁面刷新的時候,會卡死
2、初步估計是ie請求數受限,於是在頁面卸載前對請求進行abort()處理,卻發現在報錯瞭,顯示對象不支持該方法。
3、ff和chrome在刷新頁面的時候會自動中斷請求,並執行success回調
針對第二個問題,查瞭些資料,總結是jquery abort方法在ie7下的bug,解決方法如下:
打開jquery源文件,找到以下代碼
1. try {
2. var oldAbort = xhr.abort;
3. xhr.abort = function () {
4. if (xhr) {
5. oldAbort.call(xhr);
6. }
7. onreadystatechange("abort");
8. };
9. } catch (e) { }
替換成
1. try {
2. var oldAbort = xhr.abort;
3. xhr.abort = function () {
4. if (xhr) {
5. if (oldAbort.call === undefined) {
6. oldAbort();
7. } else {
8. oldAbort.call(xhr);
9. }
10. }
11.
12. onreadystatechange("abort");
13. };
14. } catch (e) { }
OK,jquery abort的bug解決瞭!
這個BUG解決瞭,發佈上去測試,問題依然存在!還是卡死!
請求是這樣寫的
1. function queryMsg() {
2. ajaxquery = $.ajax({
3. type: "get",
4. url: "http://192.168.94.26/feed/subscribe",
5. cache: false,
6. success: function (data, textStatus) {
7. if (data) {
8. //處理結果
9. }
10. queryMsg();//繼續新的請求
11. }
12. });
13. }
解決方法:
將queryMsg()替換成setTimeout(queryMsg,0)
OK,解決瞭!
以上兩個操作缺一不可。
另外,ff 和 chrome 下在頁面unload的時候對於沒有請求完成的長連接,會強制轉到success狀態,也就是說刷新頁面的時候會觸發ajax中的success事件,ie加瞭abort() 以後也會出現同樣問題,所以針對這個問題還需要做特殊處理,我的做法是加個開關參數,通過onbeforeunload事件對開關參數賦值。
完整代碼:
1. //開關
2. var _flag_is_unload = false;
3. //請求變量
4. var ajaxquery = null;
5. //查詢消息
6. function queryMsg() {
7. ajaxquery = $.ajax({
8. type: "get",
9. url: "http://192.168.94.26/feed/subscribe",
10. cache: false,
11. success: function (data, textStatus) {
12. if(!_flag_is_unload){
13. if (data) {
14. //處理消息
15. }
16. setTimeout(queryMsg, 0);
17. }
18. }
19. });
20.
21. }
22. function funBeforeunload() {
23. //中止請求
24. ajaxquery.abort();
25. //開關狀態
26. _flag_is_unload = true;
27. }
總結:
1、在頁面unload時候 ff/chrome會自動結束未完成的ajax請求,而ie不會,需要手動abort()
2、jquery(我測試的版本1.4.2) abort()方法存在bug,需要進行修復
3、由於abort()也會觸發jquery ajax 的success回調,所以需要對其做特殊處理
摘自 JsLover