在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有空闲的对象,则使用此对象,否则将创建一个新的对象。
- var XMLHttp =
- {
- //该属性用于缓存XMLHttpRequest对象数组成
- XMLHttpRequestPool:[],
- //该方法用于返回一下XMLHttpRequest对象
- getInstance:function(){
- //从XMLHttpRequestPool 对象池中取出一XMLHttpRequest个空闲的XMLHttpRequest对象
- for(var i=0;i<this.XMLHttpRequestPool.length;i++){
- //如果XMLHttpRequest的readyState为0或者为4,都表示当前的对象为空闲对象
- if(this.XMLHttpRequestPool[i].readyState ==0 ||
- this.XMLHttpRequestPool[i].readyState ==4)
- {
- return this.XMLHttpRequestPool[i];
- }
- }
- //如果没有空闲的,则会创建一个新的XMLHttpRequest对象
- this.XMLHttpRequestPool[this.XMLHttpRequestPool.length]=this.createXMLHttpRequest();
- return this.XMLHttpRequestPool[this.XMLHttpRequestPool.length-1];
- },
- createXMLHttpRequest:function()
- {
- //对于FirFox , Mozilla , pera 等浏览器 (最好是先判断这个)
- if(window.XMLHttpRequest){
- var objXMLHttp = new XMLHttpRequest();
- }
- else if (window.ActiveXObject){
- var MSXML = ['MSXML2.XMLHTTP','MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP.4.0','Microsoft.XMLHTTP'];
- for(var i=0;i<MSXML.length;i++){
- var objXMLHttp = new ActiveXObject(MSXML[i]);
- break;
- }
- }else{
- alert("创建XMLHttpRequest对象时出错!");
- }
- //Mozilla 某些版本没有readyState属性,下面进行处理
- if(objXMLHttp.readyState == null){
- //直接设置其readyState为0
- objXMLHttp.readyState = 0;
- //对于没有readyState属性的浏览器,将load动作与下面的函数关联起来
- objXMLHttp.addEventListener("load",function(){
- //当服务器加载数据完成以后,将readyState状态设为4
- objXMLHttp.readyState = 4;
- if(typeof objXMLHttp.onreadystatechange == "function"){objXMLHttp.onreadystatechange();}
- },false);
- }/*
- */
- return objXMLHttp;
- },
- //定义发送请求方法(方式[post,get],地址,数据,回调函数)
- sendRequest:function(method,url,data,callback){
- var objXMLHttp = this.getInstance();
- with(objXMLHttp){
- try{
- //加随机数防止缓存,主要是防止直接从浏览器缓存中读取数据
- if(url.indexOf("?")>0){
- url+="&randnum="+Math.random();
- }else{
- url+="?randnum="+Math.random();
- }
- //打开数据库连接
- open(method,url,true);
- //如果是POS请求
- if(method =="POST"){
- //设定请求头
- setRequestHeader('Content-Type','application/x-www-form-urlencoded','charset=UTF-8');
- send("username="+data);
- }
- if(method == "GET"){
- send(null);
- }
- //设置回调函数
- onreadystatechange = function(){
- if(readyState == 4 && (status ==200||status==304)){
- callback(objXMLHttp);
- }
- }
- }catch(e){
- alert(e);
- }
- }
- }
- }