[转]建一个XmlHttpRequest对象池
引用自:http://www.ugia.cn/?p=85
作者:Legend
在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有空闲的对象,则使用此对象,否则将创建一个新的对象。
1
/**
2
* XMLHttpRequest Object Pool
3
*
4
* @author legend <legendsky@hotmail.com>
5
* @link http://www.ugia.cn/?p=85
6
* @Copyright www.ugia.cn
7
*/
8![](/Images/OutliningIndicators/None.gif)
9
var XMLHttp = {
10
_objPool: [],
11![](/Images/OutliningIndicators/InBlock.gif)
12
_getInstance: function ()
13
{
14
for (var i = 0; i < this._objPool.length; i ++)
15
{
16
if (this._objPool[i].readyState == 0 || this._objPool[i].readyState == 4)
17
{
18
return this._objPool[i];
19
}
20
}
21![](/Images/OutliningIndicators/InBlock.gif)
22
// IE5中不支持push方法
23
this._objPool[this._objPool.length] = this._createObj();
24![](/Images/OutliningIndicators/InBlock.gif)
25
return this._objPool[this._objPool.length - 1];
26
},
27![](/Images/OutliningIndicators/InBlock.gif)
28
_createObj: function ()
29
{
30
if (window.XMLHttpRequest)
31
{
32
var objXMLHttp = new XMLHttpRequest();
33![](/Images/OutliningIndicators/InBlock.gif)
34
}
35
else
36
{
37
var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
38
for(var n = 0; n < MSXML.length; n ++)
39
{
40
try
41
{
42
var objXMLHttp = new ActiveXObject(MSXML[n]);
43
break;
44
}
45
catch(e)
46
{
47
}
48
}
49
}
50![](/Images/OutliningIndicators/InBlock.gif)
51
// mozilla某些版本没有readyState属性
52
if (objXMLHttp.readyState == null)
53
{
54
objXMLHttp.readyState = 0;
55![](/Images/OutliningIndicators/InBlock.gif)
56
objXMLHttp.addEventListener("load", function ()
57
{
58
objXMLHttp.readyState = 4;
59![](/Images/OutliningIndicators/InBlock.gif)
60
if (typeof objXMLHttp.onreadystatechange == "function")
61
{
62
objXMLHttp.onreadystatechange();
63
}
64
}, false);
65
}
66![](/Images/OutliningIndicators/InBlock.gif)
67
return objXMLHttp;
68
},
69![](/Images/OutliningIndicators/InBlock.gif)
70
// 发送请求(方法[post,get], 地址, 数据, 回调函数)
71
sendReq: function (method, url, data, callback)
72
{
73
var objXMLHttp = this._getInstance();
74![](/Images/OutliningIndicators/InBlock.gif)
75
with(objXMLHttp)
76
{
77
try
78
{
79
// 加随机数防止缓存
80
if (url.indexOf("?") > 0)
81
{
82
url += "&randnum=" + Math.random();
83
}
84
else
85
{
86
url += "?randnum=" + Math.random();
87
}
88![](/Images/OutliningIndicators/InBlock.gif)
89
open(method, url, true);
90![](/Images/OutliningIndicators/InBlock.gif)
91
// 设定请求编码方式
92
setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
93
send(data);
94
onreadystatechange = function ()
95
{
96
if (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 304))
97
{
98
callback(objXMLHttp);
99
}
100
}
101
}
102
catch(e)
103
{
104
alert(e);
105
}
106
}
107
}
108
};
109![](/Images/OutliningIndicators/None.gif)
110
示例:
111![](/Images/OutliningIndicators/None.gif)
112
<script type="text/javascript" src="xmlhttp.js"></script>
113
<script type="text/javascript">
114
function test(obj)
115
{
116
alert(obj.statusText);
117
}
118![](/Images/OutliningIndicators/None.gif)
119
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);
120
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);
121
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);
122
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);
123![](/Images/OutliningIndicators/None.gif)
124
alert('Pool length:' + XMLHttp._objPool.length);
125
</script>
126![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](/Images/OutliningIndicators/InBlock.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
47
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
49
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
64
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/InBlock.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
100
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
101
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
106
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
107
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
108
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
109
![](/Images/OutliningIndicators/None.gif)
110
![](/Images/OutliningIndicators/None.gif)
111
![](/Images/OutliningIndicators/None.gif)
112
![](/Images/OutliningIndicators/None.gif)
113
![](/Images/OutliningIndicators/None.gif)
114
![](/Images/OutliningIndicators/None.gif)
115
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
116
![](/Images/OutliningIndicators/InBlock.gif)
117
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
118
![](/Images/OutliningIndicators/None.gif)
119
![](/Images/OutliningIndicators/None.gif)
120
![](/Images/OutliningIndicators/None.gif)
121
![](/Images/OutliningIndicators/None.gif)
122
![](/Images/OutliningIndicators/None.gif)
123
![](/Images/OutliningIndicators/None.gif)
124
![](/Images/OutliningIndicators/None.gif)
125
![](/Images/OutliningIndicators/None.gif)
126
![](/Images/OutliningIndicators/None.gif)