2025-05-17

最近公司項目需要,做瞭一些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
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *