基本的封装Ajax之一
创始人
2024-07-26 18:40:46
0

Ajax,或许已经是老掉牙的话题。我学习总结一下。大概会有6篇,从基本的Ajax直至高级的应用。***会形成一个实用的Ajax工具库。

创建一个基本的Ajax应用不需要太多的代码,大概三个步骤,几十行代码即可。

1,创建Ajax的核心对象XMLHttpRequest

因为浏览器之间的不兼容,IE7之前的版本并没有原生的XMLHttpRequest对象却实现为ActiveX对象。
互联网及各种书籍中有着多种创建方式,有的复杂很多行代码,有的则简洁很少代码。当然复杂的考虑的情形更多一些。如下几乎将IE中所有的情况都考虑到了。

  1. function cretaeXHR(){   
  2. try{ return new XMLHttpRequest();}catch(e){}   
  3. try{ return new ActiveXObject('Msxml2.XMLHTTP.6.0');}catch(e){}   
  4. try{ return new ActiveXObject('Msxml2.XMLHTTP.4.0');}catch(e){}   
  5. try{ return new ActiveXObject('Msxml2.XMLHTTP.3.0');}catch(e){}   
  6. try{ return new ActiveXObject('Msxml2.XMLHTTP');}catch(e){}   
  7. try{ return new ActiveXObject('MSXML3.XMLHTTP');}catch(e){}   
  8. try{ return new ActiveXObject('MSXML.XMLHTTP');}catch(e){}   
  9. try{ return new ActiveXObject('Microsoft.XMLHTTP');}catch(e){}   
  10. try{ return new ActiveXObject('MSXML2.ServerXMLHTTP');}catch(e){}   
  11. return null;   
  12. }  

代码较少的采用对象特性判断,

  1. var xhr = window.XMLHttpRequest ? new XMLHttpRequest() :new ActiveXObject('Microsoft.XMLHTTP');  

我在这里采用精简方式,暂不考虑创建异常的情况。

2,发送请求

  1. xhr.open   
  2. xhr.send  

3,处理响应

  1. xhr.onreadystatechange = function(){   
  2. if(xhr.readyState == 4){   
  3. if(xhr.status == 200){//当然你可以把200~300之间或304的都理解成响应成功   
  4. //callback   
  5. }   
  6. }   
  7. }  

嗯,到这里没什么特别的,所有的书籍上都是这么几个步骤来着。对于初学者来说,要将这几个步骤很好的封装一下形成一个良好的模块还是很困难的。全局变量满天飞不知道怎么去组织代码,初学者开始都是这样的。现在想想是对一门语言没有足够的掌握,尤其是闭包。

这里采用 单例模式 封装成一个对象,即只有一个全局的变量将其赋值给Ajax,该对象有一个request方法。request有两个参数,***个为请求的url(必要的),字符串类型,第二个opt为配置参数(可选的),对象类型。结果处理使用内部私有的_onStateChange函数。

完整代码如下:

  1. /**   
  2. * 执行基本ajax请求,返回XMLHttpRequest   
  3. * Ajax.request(url,{   
  4. * async 是否异步 true(默认)   
  5. * method 请求方式 POST or GET(默认)   
  6. * data 请求参数 (键值对字符串)   
  7. * success 请求成功后响应函数,参数为xhr   
  8. * failure 请求失败后响应函数,参数为xhr   
  9. * });    
  10. */   
  11. Ajax =   
  12. function(){   
  13. function request(url,opt){   
  14. function fn(){}   
  15. var async = opt.async !== false,   
  16. method = opt.method || 'GET',   
  17. data = opt.data || null,   
  18. success = opt.success || fn,   
  19. failure = opt.failure || fn;   
  20. method = method.toUpperCase();   
  21. if(method == 'GET' && data){   
  22. url += (url.indexOf('?') == -1 ? '?' : '&') + data;   
  23. data = null;   
  24. }   
  25. var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');   
  26. xhr.onreadystatechange = function(){   
  27. _onStateChange(xhr,success,failure);   
  28. };   
  29. xhr.open(method,url,async);   
  30. if(method == 'POST'){   
  31. xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;');   
  32. }   
  33. xhr.send(data);   
  34. return xhr;   
  35. }   
  36. function _onStateChange(xhr,success,failure){   
  37. if(xhr.readyState == 4){   
  38. var s = xhr.status;   
  39. if(s>= 200 && s < 300){   
  40. success(xhr);   
  41. }else{   
  42. failure(xhr);   
  43. }   
  44. }else{}   
  45. }   
  46. return {request:request};   
  47. }();  

如下请求后台的一个servlet,发送参数name=jack,age=20,默认使用异步,GET方式

  1. Ajax.request('servlet/ServletJSON',{    
  2.          data : 'name=jack&age=20',    
  3.         success : function(xhr){    
  4.              //to do with xhr    
  5.         },    
  6.          failure : function(xhr){    
  7.              //to do with xhr    
  8. }    
  9. }    
  10. );   

以上是一个简单封装,用了不到40行的代码。这里的请求参数data只能是键值字符串,有时候希望可以JS对象,以便可以更灵活的传参,下一篇将从改善请求参数开始。

【编辑推荐】

  1. 使用 jQuery 简化 Ajax 开发
  2. 外国设计大师Ajax之父74张图详谈用户体验的要素
  3. 在AJAX开发中集成数据库技术
  4. Ajax和WEB服务数据格式:自定义返回格式

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...