- cai555
- 等级:


- 文章: 44
- 积分: 150

|
最后更新时间:2007-11-21 关键字: responseText empty blank
写了一个AJAX sendRequset函数,一直用得很好,突然有一天发现连续调用 sendRequest函数后,req.responseText总为“”值
java 代码
-
-
-
- var READY_STATE_UNINITIALIZED = 0;
- var READY_STATE_LOADING = 1;
- var READY_STATE_LOADED = 2;
- var READY_STATE_INTERACTIVE = 3;
- var READY_STATE_COMPLETE = 4;
-
- function sendRequest(url, params, HttpMethod, callBack){
- if(!HttpMethod){
- HttpMethod = "GET";
- }
- var queryStr = "";
- if(typeof params == 'object'){
- var querybuff = [];
- for(key in params){
- querybuff.push(key+"="+params[key]);
- }
- queryStr = querybuff.join('&');
- }else{
- queryStr = params;
- }
-
- req = initXMLHTTPRequest();
- if(req){
- var args=[];
- for(var i=4;i<arguments.length;i++){
- args.push(arguments[i]);
- }
- req.onreadystatechange = function(){
- onReadyState.call(this, req, callBack, args);
- }
- req.open(HttpMethod, url, true);
- req.setRequestHeader(
- "Content-Type", "application/x-www-form-urlencoded"
- );
- req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- req.setRequestHeader("Content-length", queryStr.length);
- req.setRequestHeader("Connection", "keep-alive");
- req.send(queryStr);
- }
- }
-
- function initXMLHTTPRequest(){
- var xRequest = null;
- if(window.XMLHttpRequest){
- xRequest = new XMLHttpRequest();
- }else if(window.ActiveXObject){
- xRequest = new ActiveXObject("Microsoft.XMLHTTP");
- }
- return xRequest;
- }
-
- function onReadyState(req, callBack, args){
- var ready = req.readyState;
- var data = null;
- if(ready == READY_STATE_COMPLETE && req.status == 200){
- data = req.responseText;
- args.unshift(data);
- callBack.apply(this, args);
- }
- }
这是怎么回事呢?最终发现原来问题出在第25行:
java 代码
- req = initXMLHTTPRequest();
由于,这么写,javascript会默认req为全局变量,所以连续调用 sendRequest,后面调用的时候会覆盖req。正确的写法应该是:
java 代码
- var req = initXMLHTTPRequest();
另外,连续调用ajax请求会导致不稳定(在FF里有时候第一次加载页面的时候,连续调用会导致某个请求失败,具体原因还在查),所以尽量不要连着调用。
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
| 返回顶楼 |
|
|
- afcn0
- 等级:


- 性别:

- 文章: 622
- 积分: 170
- 来自: 天津

|
使用var就是把XHR放进闭包当中了,由于每次函数执行都会产生不同的scope当然不会发生冲突了
|
| 返回顶楼 |
|
|