论坛首页 AJAX版 AJAX

三个字符导致responseText为“”值

浏览 440 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-11-21 关键字: responseText empty blank
写了一个AJAX sendRequset函数,一直用得很好,突然有一天发现连续调用sendRequest函数后,req.responseText总为“”值
java 代码
 
  1. /** 
  2.  * @author zhongjin.chai 
  3.  */  
  4. var READY_STATE_UNINITIALIZED = 0;  
  5. var READY_STATE_LOADING = 1;  
  6. var READY_STATE_LOADED = 2;  
  7. var READY_STATE_INTERACTIVE = 3;  
  8. var READY_STATE_COMPLETE = 4;  
  9.   
  10. function sendRequest(url, params, HttpMethod, callBack){  
  11.     if(!HttpMethod){  
  12.         HttpMethod = "GET";  
  13.     }  
  14.     var queryStr = "";  
  15.     if(typeof params == 'object'){  
  16.         var querybuff = [];  
  17.         for(key in params){  
  18.             querybuff.push(key+"="+params[key]);  
  19.         }  
  20.         queryStr = querybuff.join('&');  
  21.     }else{  
  22.         queryStr = params;  
  23.     }  
  24.       
  25.     req = initXMLHTTPRequest();  
  26.     if(req){  
  27.         var args=[];  
  28.         for(var i=4;i<arguments.length;i++){  
  29.             args.push(arguments[i]);  
  30.         }  
  31.         req.onreadystatechange = function(){  
  32.             onReadyState.call(this, req, callBack, args);  
  33.         }  
  34.         req.open(HttpMethod, url, true);  
  35.         req.setRequestHeader(  
  36.             "Content-Type""application/x-www-form-urlencoded"  
  37.         );  
  38.         req.setRequestHeader("X-Requested-With""XMLHttpRequest");  
  39.         req.setRequestHeader("Content-length", queryStr.length);  
  40.         req.setRequestHeader("Connection""keep-alive");  
  41.         req.send(queryStr);  
  42.     }  
  43. }  
  44.   
  45. function initXMLHTTPRequest(){  
  46.     var xRequest = null;  
  47.     if(window.XMLHttpRequest){  
  48.         xRequest = new XMLHttpRequest();  
  49.     }else if(window.ActiveXObject){  
  50.         xRequest = new ActiveXObject("Microsoft.XMLHTTP");  
  51.     }  
  52.     return xRequest;  
  53. }  
  54.   
  55. function onReadyState(req, callBack, args){  
  56.     var ready = req.readyState;  
  57.     var data = null;  
  58.     if(ready == READY_STATE_COMPLETE && req.status == 200){  
  59.         data = req.responseText;  
  60.         args.unshift(data);  
  61.         callBack.apply(this, args);  
  62.     }  
  63. }  
这是怎么回事呢?最终发现原来问题出在第25行:
java 代码
  1. req = initXMLHTTPRequest();  

由于,这么写,javascript会默认req为全局变量,所以连续调用sendRequest,后面调用的时候会覆盖req。正确的写法应该是:
java 代码
  1. var req = initXMLHTTPRequest();  
另外,连续调用ajax请求会导致不稳定(在FF里有时候第一次加载页面的时候,连续调用会导致某个请求失败,具体原因还在查),所以尽量不要连着调用。
   
最后更新时间:2007-11-21
使用var就是把XHR放进闭包当中了,由于每次函数执行都会产生不同的scope当然不会发生冲突了
   
0 请登录后投票
论坛首页 AJAX版 AJAX

跳转论坛:
JavaEye推荐