写了一个AJAX sendRequset函数,一直用得很好,突然有一天发现连续调用
sendRequest函数后,req.responseText总为“”值
这是怎么回事呢?最终发现原来问题出在第25行:
由于,这么写,javascript会默认req为全局变量,所以连续调用 sendRequest,后面调用的时候会覆盖req。正确的写法应该是:
另外,连续调用ajax请求会导致不稳定(在FF里有时候第一次加载页面的时候,连续调用会导致某个请求失败,具体原因还在查),所以尽量不要连着调用。
java 代码
- /**
- * @author zhongjin.chai
- */
- 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);
- }
- }
java 代码
- req = initXMLHTTPRequest();
由于,这么写,javascript会默认req为全局变量,所以连续调用 sendRequest,后面调用的时候会覆盖req。正确的写法应该是:
java 代码
- var req = initXMLHTTPRequest();