IE中同一个url第二次AJAX调用无法触发onreadystatechange事件

如果第二次通过XMLHttpRequest去请求一个URL,则不会触发onreadystatechange时间,虽然从调试插件来看,ie是进行了这次请求。

 

后来发现,这个是因为在ie下,如果请求的URL已经被浏览器cache,则调用send方法以后,xhr的readyState已经成为了4,即 一开始就是请求完成的状态,当然以后readystate不会再被赋值,也不会触发onreadystatechange事件。

 

解决办法:在调用send后立即检查xhr的readystate,如果已经结束,则直接处理,不必再等待onreadystatechange事件。

 

  1. getJSON : function(url, callback, onerror) { // 处理ajax get请求  
  2.     var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();  
  3.     onerror = $X.isFunction(onerror) ? onerror : null;  
  4.     xhr.open('GET', url, true);  
  5.     xhr.setRequestHeader("X-Requested-With""XMLHttpRequest");  
  6.     xhr.send();  
  7.     var f = function() {  
  8.         if (xhr.readyState == 4) {    
  9.             if (xhr.status == 200) {    
  10.                 try {   
  11.                     var data = eval('('+xhr.responseText+')');  
  12.                 } catch (e){  
  13.                     onerror && onerror(); // 处理json解析错误  
  14.                     xhr = null;  
  15.                     return;  
  16.                 };  
  17.                 callback(data);  
  18.             } else {  
  19.                 onerror && onerror();  
  20.             }  
  21.             xhr = null// fix memory leaks  
  22.         }  
  23.     };  
  24.     if (xhr.readyState == 4) { // for the stupid ie  
  25.         f();  
  26.     } else {  
  27.         xhr.onreadystatechange = f;  
  28.     }  

  http://www.iteye.com/topic/467019

posted @ 2011-11-25 14:53  s80895304  阅读(487)  评论(0编辑  收藏  举报