最近的一个项目中有一个常用的XMLHttp连接池对象,如下:
_objPool: [],
_getInstance: function ()...{
for (var i = 0; i < this._objPool.length; i ++)...{
if (this._objPool[i].readyState == 0 || this._objPool[i].readyState == 4)...{
return this._objPool[i];
}
}
// IE5中不支持push方法
this._objPool[this._objPool.length] = this._createObj();
return this._objPool[this._objPool.length - 1];
},
_createObj: function ()...{
if (window.XMLHttpRequest)...{
var objXMLHttp = new XMLHttpRequest();
}else...{
var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
for(var n=0; n<MSXML.length; n++)...{
try...{
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}catch(e)...{}
}
}
// mozilla某些版本没有readyState属性
if (objXMLHttp.readyState == null)...{
objXMLHttp.readyState = 0;
objXMLHttp.addEventListener("load", function ()...{
objXMLHttp.readyState = 4;
if(typeof objXMLHttp.onreadystatechange == "function")...{objXMLHttp.onreadystatechange();}
}, false);
}
return objXMLHttp;
},
// 发送请求(方法[post,get], 地址, 数据, 回调函数)
sendReq: function (method, url, data, callback)...{
var objXMLHttp = this._getInstance();
var mode = arguments.length > 4 ? arguments[4] : true;
with(objXMLHttp)...{
try...{
// 加随机数防止缓存
if (url.indexOf("?") > 0)...{url += "&randnum=" + Math.random();}
else...{url += "?randnum=" + Math.random();}
open(method, url, mode);
// 设定请求编码方式
setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
send(data);
if(mode)...{ //异步则判断readyState状态
onreadystatechange = function ()...{
if (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 304))...{
callback(objXMLHttp);
}
}
}else...{ //同步则直接回调
if (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 304))...{
callback(objXMLHttp);
}
}
}catch(e)...{alert(e);}
}
}
}
常见的调用形式如下:
if(arguments.length == 0)...{
tv.innerHTML = "<img src="../../images/loading.gif">正在加载数据...";
XMLHttp.sendReq("POST", TreeUrl, "s=mine&type=man&cid="+id, doLoadTree);
}else...{
var xml = arguments[0].responseXML;
var code = $X(xml, "code");
//余下处理略去。
}
}
但是在最近的修改中出于效率的考虑,将上述调用进行了修改,
XMLHttp.sendReq("POST", TreeUrl, "s=mine&type=man&cid="+id, doLoadTree, false);
因为页面有一部分其它数据的处理依赖于从上面调用获得的数据,所以需要以同步的形式先取得,
于是增加了红色的部分,强制XMLHttp.sendReq()发送同步请求。
修改完成后在XP SP2+IE7以及VISTA下均运行正常,唯独在XP SP2+IE6下始终无法执行,
XMLHttp.sendReq()方法始终会catch一个object Error,经过一天的调试,终于发现(请注意红色部分)
var MSXML = ['Microsoft.XMLHTTP', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
将红色部分提至最前面,这样每次请求都是建立的Microsoft.XMLHTTP对象,而非修改前的MSXML2.XMLHTTP.5.0
对象,修改后在IE6中运行正常。
通过以上实事,个人感觉IE6不支持标准的XMLHttpRequest()以及过多的XMLHTTP对象版本所带来的这种细小的
差异使得程序开发和调试变得复杂。希望IE7与将来的IE8能做些改变。