做一回标题党,因为很多人会通过那些关键字搜索进来。是否“简单好用”不太好说,因人而异,但后面两句还是比较靠谱的。
这个AJAX“类”是自己几年前写的,最近抽空整理了一下发出来,供新手或有需要的人参考
在用AJAX的时候,一般只需要关心三个步骤:
1) 请求发送前做什么;
比如:展现给用户一个loading的图片或文字信息。
2) 发送请求;
这里有三个参数:url—发送到哪里,data—发送什么数据,method—用什么方式发送数据(GET or POST)
3) 请求返回后做什么;
比如:将返回后的数据直接或组织成html后插入到页面中展现给用户。
考虑在某些情况下,请求返回的时间很长甚至没有返回,如果一直在loading,恐怕不是一种好的用户体验。所以增加一个在超时的情况下要做的步骤。
由于GET方式经常用,所以单独为它准备了一个方法。
在demo中的test3,除了演示另一种调用方式外,还演示了客户端和服务端之间通过JSON进行通信。
最 后面附有完整demo的源代码供下载 <script src="/javascripts/tinymce/themes/advanced/langs/zh.js" type="text/javascript"></script><script src="/javascripts/tinymce/plugins/javaeye/langs/zh.js" type="text/javascript"></script>
- /*!
- * 一个简单的Ajax类
- * author: ichenshy@gmail.com
- * date: 2010/06/04 Friday
- *
- * @param function fnBefore 用户自定义函数 Ajax开始前执行,若无则为null
- * @param function fnAfter 用户自定义函数 Ajax完成后执行,若无则为null
- * @param function fnTimeout 用户自定义函数 Ajax请求超时后执行,若无则为null
- * @param integer iTime 设置超时时间 单位毫秒
- * @param boolean bSync 是否为同步请求,默认为false
- */
- function Ajax(fnBefore,fnAfter,fnTimeout,iTime,bSync){
- this.before = fnBefore;
- this.after = fnAfter;
- this.timeout = fnTimeout;
- this.time = iTime ? iTime : 10000;
- this.async = bSync ? false : true;
- this._request = null;
- this._response = null;
- }
- Ajax.prototype = {
- /**
- * 将需要发送的数据进行编码
- *
- * @param object data JSON格式的数据,如: {username:"fyland",password:"ichenshy"}
- */
- formatParam : function( data ){
- if ( ! data || typeof data != "object" ) return data;
- var k,r = [];
- for ( k in data ) {
- r.push([k,'=',encodeURIComponent(data[k])].join(''));
- }
- return r.join('&');
- },
- /**
- * 创建 XMLHttpRequest对象
- */
- create : function(){
- if( window.XMLHttpRequest ) {
- this._request = new XMLHttpRequest();
- } else {
- try {
- this._request = new window.ActiveXObject("Microsoft.XMLHTTP");
- } catch(e) {}
- }
- },
- /**
- * 发送请求
- *
- * @param string url 请求地址
- * @param object or string data 可以是字符串或JSON格式的数据,如: {username:"fyland",password:"ichenshy"}
- * @param string method 请求方式 : GET or POST
- * @param boolean ifCache 返回数据是否在浏览器端缓存,默认为false;
- */
- send : function(url,data,method,ifCache){
- if ( typeof this.before == "function" ) this.before();
- method = method.toUpperCase();
- this.create();
- var self = this;
- var timer = setTimeout(function(){
- if ( typeof self.timeout == "function" ) self.timeout();
- if ( self._request ) {
- self._request.abort();
- self._request = null;
- }
- return true;
- },this.time);
- var sendBody = this.formatParam(data);
- if ( 'GET' == method ) {
- url = [url, ( url.indexOf('?') == -1 ? '?' : '&') ,sendBody].join('');
- sendBody = null;
- }
- if ( ! ifCache ) {
- url = [url, ( url.indexOf('?') == -1 ? '?' : '&') , "ajaxtimestamp=" , (new Date()).getTime()].join('');
- }
- this._request.open(method,url,this.async);
- if ( "POST" == method ) this._request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
- this._request.onreadystatechange = function(){
- if( self._request.readyState==4 ){
- if ( self._request.status==200 ){
- if ( timer ) clearTimeout(timer);
- self._response = self._request.responseText;
- if ( typeof self.after == "function") self.after(self._response);
- }
- }
- }
- this._request.send( sendBody );
- },
- /**
- * 简单的GET请求
- *
- * @param string url 请求地址
- * @param null or string or object data
- * @param object html element or string id e
- * @param string loading loading时在e中的显示
- * @param boolean ifCache 浏览器是否缓存
- */
- get : function(url,data,e,loading,ifCache){
- if ( typeof e == "string" ) e = document.getElementById(e);
- if ( loading ) {
- var rg = /\.(gif|jpg|jpeg|png|bmp)$/i;
- if ( rg.test(loading) ){
- loading = ['<img src="', loading , '" align="absmiddle" />'].join('');
- }
- this.before = function(){e.innerHTML = loading;}
- }
- this.after = function(s){e.innerHTML = s;}
- this.timeout = function(){e.innerHTML = ' 请求超时! ';}
- this.send(url,data,"GET",ifCache ? true : false);
- }
- };
常用调用方式:
- function test1(){
- (new Ajax()).get("./process.php?test=1",'',$("view"),"test1正在读取数据……"); // 这里可以传入一个loading的图片地址
- }
- function test2(){
- (new Ajax(function(){
- $("view").innerHTML = "test2正在读取数据,请稍候";
- },function(s){
- $("view").innerHTML = s;
- },function(){
- $("view").innerHTML = "Sorry,请求超时!";
- },5000) ).send("./process.php?test=2",{author:"fyland",mail:"ichenshy@gmail.com",date:"2010-06-03"},"POST");
- }
- function test3(){
- var jx = new Ajax();
- jx.before = function(){
- $("view").innerHTML = "test3正在读取数据,请稍候";
- }
- jx.after = function(s){
- var r = jsonDecode(s);
- for ( var k in r ){
- alert(k + ' : ' + r[k]);
- }
- $("view").innerHTML = "test3数据读取完毕";
- }
- jx.timeout = function(){
- $("view").innerHTML = "Sorry,TEST3请求超时!";
- }
- jx.time = 5000;
- var data = {
- author: "fyland",
- mail : "ichenshy@gmail.com",
- date : "2010-06-03"
- };
- jx.send("./process.php?test=3",data,"GET");
- }
注:
1、method只支持GET和POST
2、ifCache设为false或者不设置,可以控制浏览器不缓存,但设为true后,不一定能控制浏览器缓存返回的数据,因为还需要服务端的配合。
没有评论:
发表评论