隨筆 - 1, 文章 - 44, 評論 - 2, 引用 - 0
          數據加載中……

          建一個XMLHttpRequest對象池

          ?在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>

          posted on 2006-05-29 21:46 ASONG 閱讀(174) 評論(0)  編輯  收藏 所屬分類: JAVA

          主站蜘蛛池模板: 东源县| 太康县| 区。| 五家渠市| 阿图什市| 商洛市| 南靖县| 韶关市| 思南县| 武城县| 通山县| 自治县| 巴楚县| 温泉县| 平邑县| 胶南市| 黎平县| 长寿区| 什邡市| 乐安县| 高碑店市| 漳平市| 高淳县| 正蓝旗| 汉阴县| 昭平县| 那曲县| 万年县| 固原市| 余干县| 鸡泽县| 图们市| 黄梅县| 会宁县| 驻马店市| 万全县| 蓬莱市| 鄱阳县| 宣汉县| 六枝特区| 商南县|