蹉跎到今天终于要写Ajax部分了,平时工作中除了选择器我用jQuery的最多的就是ajax,所以这部分在自己的框架中必不可少。

XMLHttpRequest

我以为对每个使用过Ajax的人来说XMLHttpRequest对象肯定是如雷贯耳,可是在和公司小伙伴儿的讨论中我意识到,这个对象对有些已经使用Ajax很久的人来说仍然很陌生,jQuery等类库把XMLHttpRequest对象封装的太好了,以至于我们都不知道自己在使用它。关于JavaScript原生的Ajax之前写过一篇Ajax初步理解的博客,为了方便下面书写,在这里再介绍一下几个重点概念。

Ajax的核心是JavaScript对象XmlHttpRequest,这个对象为向服务器发送请求和解析服务器响应提供了流畅的接口。XmlHttpRequest可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。该对象有两个重要方法open与send

调用send()方法,请求被发往服务器,服务器根据请求生成响应(Response),传回给XHR对象,在收到响应后相应数据会填充到XHR对象的属性,有四个相关属性会被填充:

1. responseText:作为响应主体被返回的文本

2. responseXML:如果响应内容的类型是”text/xml”或”application/xml”,这个属性将保存包含着相应数据的XML文档

3. status:响应的HTTP状态(200,404,500等)

4. statusText:HTTP状态说明

XHR对象有一个readyState属性,该属性表示请求/响应过程中的当前活动阶段,每当readyState值改变的时候都会触发一次onreadystatechange事件。

浏览器兼容的创建XHR对象方法

大家都懂得,IE总会制造些麻烦,看看浏览器兼容的创建XHR对象方法,具体过程可以看看Ajax初步理解中的说明

  1. function __createXHR(){
  2. var xhr = null;
  3. try {
  4. // Firefox, Opera 8.0+, Safari,IE7+
  5. xhr = new XMLHttpRequest();
  6. }
  7. catch (e) {
  8. // Internet Explorer
  9. try {
  10. xhr = new ActiveXObject("Msxml2.XMLHTTP");
  11. }
  12. catch (e) {
  13. try {
  14. xhr = new ActiveXObject("Microsoft.XMLHTTP");
  15. }
  16. catch (e) {
  17. xhr = null;
  18. }
  19. }
  20. }
  21. return xhr;
  22. }

封装

其实看看第一段关于XHR对象的说明就明白为什么jQuery等类库会对XHR做如此彻底的封装了,这个对象实在是太复杂了,参数的设置都要有时机问题,所以我也走上了封装之路。

  1. ajax: function(configs) {
  2. var settings = {
  3. "url": "", //请求地址
  4. "method": "post", //请求使用方法
  5. "user": "", //用户名
  6. "password": "", //密码
  7. "data": null, //参数(text/json)
  8. "responseType": "text", //返回值获取方式 text/xml
  9. "headers": {}, //自定义的HttpHeader
  10. "enableCache":true, //是否使用缓存
  11. "onSucceed": null, //成功句柄
  12. "onClientError": null, //客户端错误句柄
  13. "onServerError": null //服务器端错误句柄
  14. };
  15. for (s in settings) {
  16. settings[s] = configs[s] ? configs[s] : settings[s]; //应用自定义配置
  17. }
  18. var xhr = _createXHR(); //创建XHR对象
  19. xhr.onreadystatechange = function() {
  20. if (xhr.readyState == 4) { //请求完成,响应就绪
  21. var result = settings["responseType"] == "text" ? xhr.responseText : xhr.responseXML; //返回值类型
  22. if (((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) && typeof settings['onSucceed'] == 'function') { //成功
  23. settings['onSucceed'](result, xhr.status);
  24. } else if (xhr.status >= 400 && xhr.status < 500) { //客户端出错,404啊神马的
  25. settings['onClientError'](result, xhr.status);
  26. } else if (xhr.status >= 500) { //服务器端出错
  27. settings['onServerError'](result, xhr.status);
  28. }
  29. }
  30. }
  31. xhr.open(settings['method'], settings['url'], settings['user'], settings['password']); //发送请求
  32.  
  33. if (typeof settings['headers'] == 'object') { //设置自定义headers
  34. var headers = settings['headers'];
  35. for (h in headers) {
  36. xhr.setRequestHeader(h, headers[h]);
  37. }
  38. }
  39. if(!settings['enableCache']){ //禁用缓存
  40. xhr.setRequestHeader("If-Modified-Since","0");
  41. }
  42.  
  43. if (settings["method"].toLowerCase() == "post") { //post请求
  44. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
  45. var data="";
  46. if(typeof settings["data"]=='object')
  47. {
  48. for(d in settings["data"]){
  49. data+=(d+'='+settings["data"][d]);
  50. }
  51. }else{
  52. data=settings["data"];
  53. }
  54. xhr.send(data); //传递参数
  55. } else {
  56. xhr.send(); //get请求
  57. }
  58. }

最后

这样一个简单的Ajax封装就完成了,使用的时候和jQuery类似

  1. ssLib.ajax({
  2. "url": "testajax.php",
  3. "data":{"name":"Byron"},
  4. "onSucceed": function(result) {
  5. alert(result);
  6. }
  7. });

看起类不错,不过没实际使用过呢还,希望大家多给意见。

据说每个大牛、小牛都应该有自己的库——Ajax的更多相关文章

  1. 据说每个大牛、小牛都应该有自己的库——DOM处理续

    在上篇据说每个大牛.小牛都应该有自己的库——DOM处理最后剩下attr()和css()方法没有处理,因为这两个方法当时并不自计划中,是写着写着突然想到的,一时间没有特别好的思路,当时已十一点多了,就去 ...

  2. 据说每个大牛、小牛都应该有自己的库——DOM处理

    这几天整理了一下思路,本来觉得DOM部分会有很多东西,但是忽然发现频繁使用的其实并不太多 class class处理部分主要有四个 hasClass:检查元素是否包含某个class addClass: ...

  3. 据说每个大牛、小牛都应该有自己的库——JavaScript原生对象拓展

    在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏,一是,关于写个自己的库的想法由来 ...

  4. 据说每个大牛、小牛都应该有自己的库——Event处理

    今天抽时间写了一部分Event处理方面的函数愈发的觉得jQuery的优秀,自己前期的想法太粗糙,造成后面这些函数参数很多,操作很很不直观,看样子是要重构的节奏,还好小伙儿伴们安慰,架构都是改出来的.继 ...

  5. 让所有网站都提供API的Python库:Toapi

    这是一个让所有网站都提供API的Python库.以前,我们爬取数据,然后把数据存起来,再创造一个api服务以便其他人可以访问.为此,我们还要定期更新我们的数据.这个库让这一切变得容易起来.你要做的就是 ...

  6. Xcode 5.1 编译模拟器以及真机都能使用的静态库

    Xcode 5.1.dmg 下载地址 http://pan.baidu.com/s/1jGJpKm6 1.新建 Framework & Library 工程 我起名叫ShowInfo,下面为其 ...

  7. pycharm每次新建项目都要重新安装一些第三方库的解决办法(转载防删)

    目前有三个解决办法,也是亲测有用的: 第一个方法:因为之前有通过pycharm的project interpreter里的+号添加过一些库,但添加的库只是指定的项目用的,如果想要用,就必须用之前的项目 ...

  8. 每个android项目都应该使用的android 库

    http://blog.teamtreehouse.com/android-libraries-use-every-project A good developer knows to never re ...

  9. JavaScript原生对象拓展

    JavaScript原生对象拓展 在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏 ...

随机推荐

  1. CentOS 6.5 x86_64系统手动释放内存

    1.查询当前内存使用情况和释放缓存的参数 redismaster 10:29:24 [~] [root] free -m total used free shared buffers cachedMe ...

  2. Config文件的读写

    using System; using System.Configuration; using System.Xml; namespace COMMON { public class ConfigHe ...

  3. python第一天基础1-2

    python入门 1 第一个python代码: 在linux上创建第一个.py脚本 #!/usr/bin/env python #-*- coding:utf-8 -*- print "He ...

  4. hdoj 2039 三角形

    Problem Description 给定三条边,请你判断一下能不能组成一个三角形.   Input 输入数据第一行包含一个数M,接下有M行,每行一个实例,包含三个正数A,B,C.其中A,B,C & ...

  5. hdoj 2034 人见人爱A-B

    Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...

  6. HDU Game Theory

    5795 || 3032 把x个石子的堆分成非空两(i, j)或三堆(i, j, k)的操作->(sg[i] ^ sg[j])或(sg[i] ^ sg[j] ^ sg[k])是x的后继 #def ...

  7. jQuery外链新窗口打开

    对于外链,为了留住用户在本站,我们通常会使用新窗口打开,你可以设置target="_blank".然而手动一个是麻烦,另一个则是有可能会遗漏,本文通过jQuery查询要点击的链接, ...

  8. SVN的服务器端用户权限配置

    第一:用户的配置 SVN和apache整合的话,用户可以直接使用htpasswd dav_svn.passwd_file_address USERNAME来配置. 而账户的管理可以用dav_svn.a ...

  9. Oracle学习指南

    Oracle学习指南 你走的那天,我决定不落泪,迎着风撑着眼帘用力不眨眼 创建数据库.创建用户.创建表空间.创建表.插入数据..... 1.用系统用户登录,任选系统用户 代码: >>sql ...

  10. win7下matplotlib安装(64位)

    前段时间爬了一些数据,想着以后要将数据的分析结果什么的展示出来,就想着下个MATLAB,某天在微信上的一篇文章发现matplotlib库,是用于Python的一个不错的图形化库,就想着装上耍耍.不过安 ...