XMLHttpRequest 对象池

在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有空闲的对象,则使用此对象,否则将创建一个新的对象。
  1. var XMLHttp = 
  2. {
  3.     //该属性用于缓存XMLHttpRequest对象数组成
  4.     XMLHttpRequestPool:[],
  5.     //该方法用于返回一下XMLHttpRequest对象
  6.     getInstance:function(){
  7.         //从XMLHttpRequestPool 对象池中取出一XMLHttpRequest个空闲的XMLHttpRequest对象
  8.         for(var i=0;i<this.XMLHttpRequestPool.length;i++){
  9.             //如果XMLHttpRequest的readyState为0或者为4,都表示当前的对象为空闲对象
  10.             if(this.XMLHttpRequestPool[i].readyState ==0 ||
  11.                this.XMLHttpRequestPool[i].readyState ==4)
  12.             {
  13.                 return this.XMLHttpRequestPool[i];  
  14.             }
  15.         }
  16.         //如果没有空闲的,则会创建一个新的XMLHttpRequest对象
  17.         this.XMLHttpRequestPool[this.XMLHttpRequestPool.length]=this.createXMLHttpRequest();
  18.         return this.XMLHttpRequestPool[this.XMLHttpRequestPool.length-1];
  19.     },
  20.     
  21.     createXMLHttpRequest:function()
  22.     {
  23.         //对于FirFox , Mozilla , pera 等浏览器 (最好是先判断这个)
  24.         if(window.XMLHttpRequest){
  25.             var objXMLHttp = new XMLHttpRequest();
  26.         }
  27.         else if (window.ActiveXObject){
  28.             var MSXML = ['MSXML2.XMLHTTP','MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP.4.0','Microsoft.XMLHTTP'];
  29.             for(var i=0;i<MSXML.length;i++){
  30.                     var objXMLHttp = new ActiveXObject(MSXML[i]);
  31.                     break;
  32.             }
  33.         }else{
  34.             alert("创建XMLHttpRequest对象时出错!");
  35.         }
  36.         //Mozilla  某些版本没有readyState属性,下面进行处理
  37.         
  38.         if(objXMLHttp.readyState == null){
  39.             //直接设置其readyState为0
  40.             objXMLHttp.readyState = 0;
  41.             //对于没有readyState属性的浏览器,将load动作与下面的函数关联起来
  42.             objXMLHttp.addEventListener("load",function(){
  43.                 //当服务器加载数据完成以后,将readyState状态设为4
  44.                 objXMLHttp.readyState = 4;
  45.                 if(typeof objXMLHttp.onreadystatechange == "function"){objXMLHttp.onreadystatechange();}
  46.             },false);
  47.         }/*
  48.         */
  49.         return objXMLHttp;
  50.     },
  51.     
  52.     //定义发送请求方法(方式[post,get],地址,数据,回调函数)
  53.     sendRequest:function(method,url,data,callback){
  54.         var objXMLHttp = this.getInstance();
  55.         with(objXMLHttp){
  56.             try{
  57.                 //加随机数防止缓存,主要是防止直接从浏览器缓存中读取数据
  58.                 if(url.indexOf("?")>0){
  59.                     url+="&randnum="+Math.random();
  60.                 }else{
  61.                     url+="?randnum="+Math.random();
  62.                 }
  63.                 //打开数据库连接
  64.                 open(method,url,true);
  65.                 //如果是POS请求
  66.                 if(method =="POST"){
  67.                     //设定请求头
  68.                     setRequestHeader('Content-Type','application/x-www-form-urlencoded','charset=UTF-8');
  69.                     send("username="+data);
  70.                 }
  71.                 if(method == "GET"){
  72.                     send(null);
  73.                 }
  74.                 //设置回调函数
  75.                 onreadystatechange = function(){
  76.                     if(readyState == 4 && (status ==200||status==304)){
  77.                         callback(objXMLHttp);
  78.                     }
  79.                 }
  80.                 
  81.             }catch(e){
  82.                 alert(e);
  83.             }
  84.         }
  85.         
  86.     }
  87. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值