具体实现思路: 我们使用一个数组来存储已创建的xmlhttp对象实例,然后每次调用从池中去取一个实例。xmlhttp实例通讯完毕后我们不用做任何处置,因为它自身的readyState属性可以标识出它是否可用,如果当时没有空闲的xmlhttp实例,且池中的实例数小于最大实例个数,那么就创建一个新的实例并放入池中。重新改进的实现代码如下: 复制代码 代码如下: //封装XMLHTTP的MyAjaxObj类 var MyAjaxObj = new Object(); var maxXmlHttpCount = 5; //最多5个xmlhttp对象存在
MyAjaxObj.reqList = []; //可以清空里面的项
MyAjaxObj.getFreeObj = function() { var req = null; var len = this.reqList.length; //先从当前的池里取 for (var i = 0; i < len; i++) { if (this.reqList[i]) { if (this.reqList[i].readyState == 4 || this.reqList[i].readyState == 0) { req = this.reqList[i]; break; } } } //如果没有闲置的对象,自己独立创建 if (req == null) { if (this.reqList.length < maxXmlHttpCount) { req = getXmlHttp(); this.reqList.push(req); } } return req; }
//创建一个XMLHTTP对象,兼容不同的浏览器 function getXmlHttp() { var xmlHttp = false; var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]; for (var i = 0; i < arrSignatures.length; i++) { try { xmlHttp = new ActiveXObject(arrSignatures[i]); return xmlHttp; } catch (oError) { xmlHttp = false; //ignore } } // throw new Error("MSXML is not installed on your system."); if (!xmlHttp && typeof XMLHttpRequest != "undefined") { xmlHttp = new XMLHttpRequest(); } return xmlHttp; }