YCOE

You Can't stOp mE!

导航

提供一个更为完善的XMLHttp对象生成法

Posted on 2006-03-20 12:49  YCOE  阅读(700)  评论(1编辑  收藏  举报
在之前发表的文章里提到过一种发送XMLHttp请求的方法,在这里提供一个更完善的方案。

代码:
  1var XMLHttp = {
  2    _objPool: [],
  3    _getInstance: function (){//=============从XMLHttpRequest实例对象池中取得一个实例
  4        for (var i = 0; i < this._objPool.length; i ++){
  5            if (this._objPool[i].readyState == 0 || this._objPool[i].readyState == 4){
  6                return this._objPool[i];
  7            }

  8        }

  9        
 10        // IE5中不支持push方法
 11        this._objPool[this._objPool.length] = this._createObj();
 12
 13        return this._objPool[this._objPool.length - 1];
 14    }
,
 15
 16    _createObj: function (){//================创建XMLHttpRequest实例对象
 17        if (window.XMLHttpRequest){
 18            var objXMLHttp = new XMLHttpRequest();
 19        }
else{
 20            var MSXML = ['Microsoft.XMLHTTP','MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
 21            for(var n = 0; n < MSXML.length; n ++){
 22                try{
 23                    var objXMLHttp = new ActiveXObject(MSXML[n]);        
 24                    break;
 25                }
catch(e){}
 26            }

 27         }
          
 28        
 29        // mozilla某些版本没有readyState属性
 30        if (objXMLHttp.readyState == null){
 31            objXMLHttp.readyState = 0;
 32
 33            objXMLHttp.addEventListener("load"function (){
 34                    objXMLHttp.readyState = 4;
 35                    
 36                    if (typeof objXMLHttp.onreadystatechange == "function"){
 37                        objXMLHttp.onreadystatechange();
 38                    }

 39                }
,  false);
 40        }

 41        return objXMLHttp;
 42    }
,
 43    
 44    loadJs: function(file,type0){
 45            var head = document.getElementsByTagName('HEAD').item(0);
 46            var script = document.createElement('SCRIPT');
 47            script.src = "Js/"+file+".js";
 48            if(type0 == "jscript"){
 49                script.type = "text/jscript";
 50            }
else if(type0 == "vbscript"){
 51                script.type = "text/vbscript";
 52            }
else{
 53                script.type = "text/javascript";
 54            }

 55            head.appendChild(script);
 56        }
,
 57    
 58    showLoadInfo:function(){
 59        try{
 60            document.getElementById("load").style.visibility = "visible";
 61            document.getElementById("browser").style.visibility = "hidden";
 62        }
catch(e){}
 63    }
,
 64    
 65    // 发送请求(方法[post,get], 地址, 数据, 回调函数)
 66    //==================发送异步请求
 67    sendReq: function (method, url, data, callback){
 68        var objXMLHttp = this._getInstance();
 69
 70        with(objXMLHttp){
 71            try{
 72                // 加随机数防止缓存
 73                if (url.indexOf("?"> 0){
 74                    url += "&randnum=" + Math.random();
 75                }
else{
 76                    url += "?randnum=" + Math.random();
 77                }

 78                open(method, url, true);
 79                // 设定请求编码方式
 80                setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
 81                send(data);
 82                onreadystatechange = function (){
 83                    if (objXMLHttp.readyState == 4{
 84                         if (objXMLHttp.status == 200{
 85                            callback(objXMLHttp);
 86                            //document.getElementById("load").style.visibility = "hidden";
 87                         }
else if(objXMLHttp.status == 404){
 88                            alert("找不到文件");
 89                         }
else{
 90                            alert("HTTP error: "+objXMLHttp.status);
 91                         }

 92                    }

 93                }

 94            }
catch(e){
 95                alert("Error\n"+e);
 96            }

 97        }

 98    }

 99}
;
100
101<!--============不要修改以下代码!!==============->
102glbEncode=new Array();
103 //重编码
104function reCode(b){
105    var s=rsB(b+" ");
106    s=escape(s).replace(/%u/gi,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/ig,"%@$1$2");
107    var uniS=s.match(/\%@(.{4})/g);
108    s=s.replace(/@/g,"");
109    if(uniS){
110        var k;
111        for(var i=0;i<uniS.length;i++){
112            k=uniS[i].substring(2,6);
113            if(!glbEncode[k]){
114                glbEncode[k]=escape(vbChar(eval("0x"+k))).substring(1,6);
115            }

116        }

117        tempA=s.split("%");
118        for(var i=0;i<tempA.length;i++){
119            if(tempA[i].length!=2){
120                tempA[i]=glbEncode[tempA[i]];
121            }

122        }

123        s=tempA.join("%");
124    }

125    return unescape(s);
126}

重新编码应用:
VBScript.js
    Function rsB(vIn)
        rsB
=MidB(vIn,1)
    
End Function 
    
Function vbChar(ss)
        vbChar 
= Chr(ss)
    
End Function



这里把它设计成对象的形式,可以通过XMLHttp直接取得这个对象,同时,应用池的思想,在浏览器加载时自动生成对象池,可以满足用户大量的异步请求。

继承之前的方法,动态加载JS文件,选择性显示请求进程,还有编码问题(使用之前要加载VBScript.js
文件)。