在之前发表的文章里提到过一种发送XMLHttp请求的方法,在这里提供一个更完善的方案。
代码:
重新编码应用:
VBScript.js
这里把它设计成对象的形式,可以通过XMLHttp直接取得这个对象,同时,应用池的思想,在浏览器加载时自动生成对象池,可以满足用户大量的异步请求。
继承之前的方法,动态加载JS文件,选择性显示请求进程,还有编码问题(使用之前要加载VBScript.js
文件)。
代码:
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}
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
rsB=MidB(vIn,1)
End Function
Function vbChar(ss)
vbChar = Chr(ss)
End Function
这里把它设计成对象的形式,可以通过XMLHttp直接取得这个对象,同时,应用池的思想,在浏览器加载时自动生成对象池,可以满足用户大量的异步请求。
继承之前的方法,动态加载JS文件,选择性显示请求进程,还有编码问题(使用之前要加载VBScript.js
文件)。