Ajax简易框架

    上个月写的一个简易ajax模板。也参考了一些网上的资料,本着“取之于网络,用之于网络”的原则,先将源代码贴出来,代码中有详细的注释。欢迎各种形式的讨论和指正,感谢每一位读者。

   

 

代码
1 /**
2 * Author:屈小勇<br/>
3 * Date:2010年11月30日</br>
4 * Description:Ajax通用模板</br>
5 * Example:<br/><pre>
6 * ----------------------------------------------------------------
7 * var ajax = new Ajax("1.jsp");//var ajax = new Ajax();this.setRequestUrl("1.jsp");等效
8 * ajax.setParams("SingleTotalSum=6000");//设置参数列表
9 * ajax.setEncodeURI(true);//设置编码为true
10 * ajax.setMethod('get');//将http设置为get方法
11 * ajax.setElementID("singleTotalSum");//设置DOM元素ID
12 * ajax.onLoading = function() {
13 * //Do what you want to do
14 * };
15 * ajax.onLoaded = function() {
16 * //Do what you want to do
17 * };
18 * ajax.onInteractive = function() {
19 * //Do what you want to do
20 * };
21 * ajax.onCompletion = function() {
22 * //Do what you want to do
23 * };
24 * ajax.runAjax();
25 * ---------------------------------------------------------------
26 * </pre>
27 */
28 function Ajax(url) {
29
30 //失败提示信息
31   var _AjaxFailedAlert = "Your browser does not support the enhanced functionality of this website\n",
32
33 //请求的url,不包含传递参数的纯地址
34   _requestUrl = url,
35
36 //请求方法,默认为post方式
37 _method = "post",
38
39 //请求时传递的参数
40 _params = "",
41
42 //是否要编码uri字符串
43 _encodeURI = true,
44
45 //是否要动态执行服务器端返回的脚本
46 _execute = false,
47
48 //DOM对象ID
49 _elementID = "",
50
51 _responseText = "",
52
53 _responseXML = "";
54
55 //设置请求的url
56 this.setRequestUrl = function(_url) {
57 _requestUrl = _url;
58 };
59
60 //获取请求的url
61 this.getRequestUrl = function() {
62 return _requestUrl;
63 };
64
65 //设置http方法
66 this.setMethod = function(method) {
67 method = method.toLowerCase();
68 if (method == 'get' || method == 'post') {
69 _method = method;
70 }
71 };
72
73 //获取http方法
74 this.getMethod = function() {
75 return _method;
76 };
77
78 //设置参数列表
79 this.setParams = function(params) {
80 _params = params;
81 };
82
83 //获取参数列表
84 this.getParams = function() {
85 return _params;
86 };
87
88 //设置是否编码
89 this.setEncodeURI = function(b) {
90 _encodeURI = b == true;
91 };
92
93 //获取是否编码
94 this.isEncodeURI = function() {
95 return _encodeURI == true;
96 };
97
98 //设置是否动态执行服务器返回的脚本
99 this.setExecuteScript = function(execute) {
100 _execute = execute == true;
101 };
102
103 //获取是否动态执行服务器返回的脚本
104 this.isExecuteScript = function() {
105 return _execute == true;
106 };
107
108 //设置DOM元素ID
109 this.setElementID = function(elementID) {
110 _elementID = elementID;
111 };
112
113 //获取DOM的ID
114 this.getElementID = function() {
115 return _elementID;
116 }
117
118 //获取responseText的值
119 this.getResponseText = function() {
120 return _responseText;
121 };
122
123 //获取responseXMl的值
124 this.getResponseXML = function() {
125 return _responseXML;
126 }
127
128 //回调函数,加载中
129 this.onLoading = function() {
130 };
131
132 //回调函数,加载完成
133 this.onLoaded = function() {
134 };
135
136 //回调函数,加载完成,但还需要解析相应数据
137 this.onInteractive = function() {
138 };
139
140 //回调函数,加载完成,且数据解析完毕
141 this.onCompletion = function() {
142 };
143
144 //创建XHR对象,IE6及以下版本的浏览器需要用ActiveXObject对象创建
145 this.createXHR = function() {
146 this.XHR = window.XMLHttpRequest ? new XMLHttpRequest()
147 : new ActiveXObject("Microsoft.XMLHTTP");
148 if (!this.XHR) {
149 this.failed = true;
150 }
151 };
152
153 //设置参数
154 this.setVariable = function(name, value) {
155 //一个name,一个value再加一个等号,至少需要3个字符
156 if (_params.length < 3) {
157 _params = name + "=" + value;
158 } else {
159 _params += "&" + name + "=" + value;
160 }
161 };
162
163 //编码名值对,并返回以等号连接后的字符串结果
164 this.encodeVariable = function(name, value) {
165 return (encodeURIComponent(name) + "=" + encodeURIComponent(value));
166 };
167
168 //编码字符串
169 this.encodeURLString = function(s) {
170 varArray = s.split("&");
171 for ( var i = 0; i < varArray.length; i++) {
172 urlVars = varArray[i].split("=");
173 if (urlVars[0].indexOf('amp;') != -1) {
174 urlVars[0] = urlVars[0].substring[4];
175 }
176 varArray[i] = this.encodeVariable(urlVars[0], urlVars[1]);
177 }
178 return varArray.join("&");
179 };
180
181 //eval允许动态执行javascript
182 this.runResponse = function() {
183 eval(_responseText);
184 };
185
186 //运行ajax主逻辑
187 this.runAjax = function(url) {
188 this.responseStatus = new Array(2);
189 if (this.failed && _AjaxFailedAlert) {
190 alert(_AjaxFailedAlert);
191 } else {
192 if (url) {
193 if (_params.length) {
194 this.setParams(this.getParams() + "&" + url);//_params = _params + "&" + url;
195 } else {
196 _params = url;
197 }
198 }
199 if (_encodeURI) {
200 var d = new Date();
201 var timeval = d.getTime();
202 _params = this.encodeURLString(_params);//编码
203 this.setVariable("rndval", timeval);//追加时间参数,避免浏览器缓存
204 }
205 if (_elementID) {
206 this.elementObj = document.getElementById(_elementID);
207 }
208 if (this.XHR) {
209 var self = this;
210 if (_method == 'get') {
211 var totalURLString = _requestUrl + "?" + _params;
212 this.XHR.open(_method, totalURLString, true);
213 } else {
214 this.XHR.open(_method, _requestUrl, true);
215 }
216 if (_method == 'post') {
217 try {
218 this.XHR.setRequestHeader('Content-Type',
219 'application/x-www-form-urlencoded');
220 } catch (e) {
221 }
222 }
223 this.XHR.send(_params);
224 this.XHR.onreadystatechange = function() {
225 switch (self.XHR.readyState) {
226 case 1:
227 self.onLoading();
228 break;
229 case 2:
230 self.onLoaded();
231 break;
232 case 3:
233 self.onInteractive();
234 break;
235 case 4:
236 _responseText = self.XHR.responseText;
237 _responseXML = self.XHR.responseXML;
238 self.responseStatus[0] = self.XHR.status;
239 self.responseStatus[1] = self.XHR.statusText;
240 self.onCompletion();
241 if (_execute) {
242 self.runResponse();
243 }
244 if (self.elementObj) {
245 var elementNodeName = self.elementObj.nodeName;
246 elementNodeName.toLowerCase();
247 if (elementNodeName == 'input'
248 || elementNodeName == 'select'
249 || elementNodeName == 'option'
250 || elementNodeName == 'textarea') {
251 self.elementObj.value = _responseText;
252 } else {
253 self.elementObj.innerHTML = _responseText;
254 }
255 }
256 _params = "";
257 break;
258 }
259 };
260 }
261 }
262 };
263 this.createXHR();
264 }

 

posted @ 2010-12-18 13:17  issize  阅读(411)  评论(0)    收藏  举报