Ajax 对象池,可同时发送多个Ajax请求,兼容所有主流浏览器。

项目需要临时做的,尚未优化,但已足够应付大部分应用了,兼容多浏览器,无BUG。此类中加入了队列方式,在实例化对象时设置第一个参数为大于0的数就会开启,多请求时如果超过这个数值就会暂存到队列中稍后执行。

1 /*
2  * --------------------------------------------------------------
3  * File name   : xdh_ajax.js
4  * Description : Ajax对象池
5  * Requirement : IE6+,FireFox3.0+,Opera,Chrome
6  * Charset     : gb2312
7  *
8  * Copyright(C), Xing DongHai, 2010-Now, All Rights Reserved.
9  * Author: Xing DongHai (xingdonghai@gmail.com)
10  * --------------------------------------------------------------
11  */
12  
13 function $$(id){return document.getElementById(id);}
14 function xdh_ajax(_poolSize,_instanceName){
15     this.ajaxPool = new Array();
16     this.queryArr = new Array();
17     this.instanceName = '';
18     this.poolSize = 0;
19     var _nextNum = 0;
20  
21     //创建一个XMLhttp对象
22     this.createXMLhttp = function(){
23         if(typeof(ajax.ajaxPool) == null) ajax.ajaxPool = new Array();
24         if(window.XMLHttpRequest){
25             this.ajaxPool[_nextNum] = new XMLHttpRequest();
26         }else if(window.ActiveXObject){
27             this.ajaxPool[_nextNum] = new ActiveXObject("Microsoft.XMLHTTP");
28         }
29         _nextNum = _nextNum + 1;
30     };
31  
32     //构造函数
33     this.init = function(_poolSize,_instanceName){
34         if(!isNaN(_poolSize) && _poolSize != 0) this.poolSize = _poolSize;
35         if(typeof(_instanceName) == 'undefined'){
36             alert('必须指定实例名称');
37             return false;
38         }else this.instanceName = _instanceName;
39     };
40  
41     //获取一个XMLhttp对象
42     this.getInstance = function(){
43         for(_i in this.ajaxPool){
44             if(this.ajaxPool[_i].readyState == 0 || this.ajaxPool[_i].readyState == 4){
45                 this.ajaxPool[_i].onreadystatechange = function(){};
46                 return this.ajaxPool[_i];
47             }
48         }
49         if(this.poolSize == 0 || _nextNum < this.poolSize){
50             this.createXMLhttp();
51             return this.ajaxPool[_nextNum - 1];
52         }else{
53             return -1;
54         }
55         return false;
56     };
57  
58     //立即执行一个独立的请求
59     this.queryRightAway = function(_method,_url,_func,_data){
60         if(window.XMLHttpRequest){
61             var _o = new XMLHttpRequest();
62         }else if(window.ActiveXObject){
63             var _o = new ActiveXObject("Microsoft.XMLHTTP");
64         }
65         if(_method == 'GET'){
66             var joinstr = 'ts='+Math.random();
67             joinstr = (_url.indexOf('?') > -1) ? '&'+joinstr : '?'+joinstr;
68             _o.open('GET',_url+joinstr,true);
69             _o.send(null);
70         }else if(_method == 'POST'){
71             var _sendData = 'value='+encodeURIComponent(_data);
72             _o.open('POST',_url,true);
73             _o.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
74             _o.send(_sendData);
75         }
76         if(typeof(_func) != 'undefined' && _func != ''){
77             if(typeof(_func) == 'object'){
78                 var _param = '';
79                 for(var _i=1;_i<_func.length;_i++){
80                     _param = _param + ',"' + _func[_i] + '"';
81                 }
82                 _o.onreadystatechange = function(){if(_o.readyState == 4){eval('_func[0](_o'+_param+');');}};
83             }else{
84                 _o.onreadystatechange = function(){if(_o.readyState == 4){_func(_o);}};
85             }
86         }
87     };
88  
89     //将请求加入到队列中
90     this.addQueryToArr = function(_method,_url,_func,_data){
91         this.queryArr.push(Array(_method,_url,_func,_data));
92     };
93  
94     //取得队列中的第一个请求
95     this.getQueryFromArr = function(){
96         return this.queryArr.shift();
97     };
98  
99     //检查在当前请求前时候还有其他请求在队列中,有的话优先执行队列中的请求,如没有则执行本次
100     this.checkQuery = function(_method,_url,_func,_data){
101         var _obj = this.getInstance();
102         if(_obj === falsereturn false;
103         if(_obj === -1){
104             if(typeof(_method) != 'undefined')this.addQueryToArr(_method,_url,_func,_data);
105             return true;
106         }
107         if(this.queryArr.length != 0){
108             if(typeof(_method) != 'undefined')this.addQueryToArr(_method,_url,_func,_data);
109             var temp = this.getQueryFromArr();
110         }else{
111             var temp = Array(_method,_url,_func,_data);
112         }
113         temp = Array(_obj,temp[0],temp[1],temp[2],temp[3]);
114         return temp;
115     };
116  
117     //打开链接
118     //   _method:请求方式
119     //      _url:请求网址
120     //     _func:回调函数,如果是数组,那么数组的第一个元素为函数名,数组的其他元素则为该函数的参数
121     //     _data:POST方法的数据,目前仅为示例,使用需修改
122     //_rightaway:是否立即执行请求
123     this.query = function(_method,_url,_func,_data,_rightaway){
124         if(_rightaway == 1){
125             this.queryRightAway(_method,_url,_func,_data);
126             return true;
127         }
128         var _q = this.checkQuery(_method,_url,_func,_data);
129         if(_q === falsereturn false;
130         if(_q === truereturn true;
131         if(_q[1] == 'GET'){
132             var joinstr = 'ts='+Math.random();
133             joinstr = (_q[2].indexOf('?') > -1) ? '&'+joinstr : '?'+joinstr;
134             _q[0].open('GET',_q[2]+joinstr,true);
135             _q[0].send(null);
136         }else if(_q[1] == 'POST'){
137             var _sendData = 'value='+encodeURIComponent(_q[4]);
138             _q[0].open('POST',_q[2],true);
139             _q[0].setRequestHeader("Content-Type","application/x-www-form-urlencoded");
140             _q[0].send(_sendData);
141         }
142         var callback = (this.poolSize != 0) ?'if('+this.instanceName+'.queryArr.length != 0)'+this.instanceName+'.query();' '';
143         //2010-11-05:修正在回调函数中执行跳转出现脚本错误(ajax为空或不是对象)
144         //callback += this.instanceName + '.release();';
145         callback += 'if('+this.instanceName+'){' this.instanceName +'.release();}';
146         if(typeof(_q[3]) != 'undefined' && _q[3] != ''){
147             if(typeof(_q[3]) == 'object'){
148                 var _param = '';
149                 for(var _i=1;_i<_q[3].length;_i++){
150                     _param = _param + ',"' + _q[3][_i] + '"';
151                 }
152                 _q[0].onreadystatechange = function(){if(_q[0].readyState == 4){eval('_q[3][0](_q[0]'+_param+');'+callback);}};
153             }else{
154                 _q[0].onreadystatechange = function(){if(_q[0].readyState == 4){eval('_q[3](_q[0]);'+callback);}};
155             }
156         }
157     };
158  
159     //释放对象
160     this.release = function(isabort){
161         for(_i in this.ajaxPool){
162             if(isabort == 1){
163                 this.ajaxPool[_i].onreadystatechange = function(){};
164                 this.ajaxPool[_i].abort();
165             }
166             if(this.ajaxPool[_i].readyState == 0 || this.ajaxPool[_i].readyState == 4){
167                 this.ajaxPool.splice(_i,1);
168                 _nextNum = _nextNum - 1;
169             }
170         }
171     };
172  
173     //初始化类
174     this.init(_poolSize,_instanceName);
175 }
176  
177 //此函数用于在跳出时终止请求
178 function closewindow(){
179     if(typeof(ajax) != 'undefined' && ajax != null){
180         _isclose = true;
181         _unfinishedTotal = _unfinished = 0;
182         while(ajax.ajaxPool.length != 0){
183             ajax.release(1);
184         }
185         ajax = null;
186     }
187 }
188 window.onbeforeunload = window.onunload = closewindow;

在你的回调函数中必须声明至少一个参数,此参数为一个XMLHttpRequest对象实例,具体请看下面示例。 
release方法请在适当的时候自行调用,以免意外发生。 
一个简单的应用例子,获取服务器时间。 
xdh_reponse.php

1 <?php
2 die(date('Y-m-d H:i:s'));
3 ?>

xdh_request.html

1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
4 <script language="javascript" type="text/javascript" src="xdh_ajax.js"></script>
5 <script language="javascript" type="text/javascript">
6 var ajax = new xdh_ajax(0,'ajax');
7 function update(_obj){
8  $$('serverTime').innerHTML = _obj.responseText;
9 }
10 function query(){
11  ajax.query('GET','xdh_reponse.php',update);
12 }
13 </script>
14 <title>获取时间</title>
15 </head>
16  
17 <body>
18 <div id="serverTime"></div>
19 <input type="button" onclick="query()" value="更新" />
20 </body>
21 </html>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值