建一个XMLHttpRequest对象池

ZDNet软件频道 时间:2008-06-28 作者: | 中国IT实验室 我要评论()
本文关键词:对象池 Request xml 软件
解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有空闲的对象,则使用此对象,否则将创建一个新的对象。
在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个xmlHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的xmlHttpRequest对象,也会造成浪费。解决的办法就是创建一个xmlHttpRequset的对象池,如果池里有空闲的对象,则使用此对象,否则将创建一个新的对象。
  下面是我最近写的一个简单的类:
  
  /**
   * xmlHttpRequest Object Pool
   *
   * @author legend <legendsky@hotmail.com>
   * @link http://www.ugia.cn/?p=85
   * @Copyright www.ugia.cn
   */
  
  var 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();
  
   with(objxmlHttp)
   {
   try
   {
   // 加随机数防止缓存
   if (url.indexOf("?") > 0)
   {
   url += "&randnum=" + Math.random();
   }
   else
   {
   url += "?randnum=" + Math.random();
   }
  
   open(method, url, true);
  
   // 设定请求编码方式
   setRequestHeader(’Content-Type’, ’application/x-www-form-urlencoded; charset=UTF-8’);
   send(data);
   onreadystatechange = function ()
   {
   if (objxmlHttp.readyState == 4 && (objxmlHttp.status == 200 || objxmlHttp.status == 304))
   {
   callback(objxmlHttp);
   }
   }
   }
   catch(e)
   {
   alert(e);
   }
   }
   }
  };
  
  示例:
  <script type="text/JavaScript" src="xmlhttp.js"></script>
  <script type="text/Javascript">
  function test(obj)
  {
   alert(obj.statusText);
  }
  
  xmlHttp.sendReq(’GET’, ’http://www.ugia.cn/wp-data/test.htm’, ’’, test);
  xmlHttp.sendReq(’GET’, ’http://www.ugia.cn/wp-data/test.htm’, ’’, test);
  xmlHttp.sendReq(’GET’, ’http://www.ugia.cn/wp-data/test.htm’, ’’, test);
  xmlHttp.sendReq(’GET’, ’http://www.ugia.cn/wp-data/test.htm’, ’’, test);
  
  alert(’Pool length:’ + xmlHttp._objPool.length);
  </script>

对象池

Request

xml

软件


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134