jQuery ajax(复习)—Baidu ajax request分离版


Posted in Javascript onJanuary 24, 2013

你没有看错标题,本文的确是在讲Baidu ajax,不过是很久很久以前的版本了。
由于jQuery ajax模块有800+行,而核心函数jQuery.ajax就有380+行,直接分析这段代码很容易被代码逻辑弄晕。

所以我们先分析一段简单的ajax代码,来自早期的百度七巧板项目。
通过这个来先复习一遍ajax的知识。

baidu.ajax.request分离版

/** 
* 发送一个ajax请求 
* @author: allstar, erik, berg 
* @name ajax.request 
* @function 
* @grammar ajax.request(url[, options]) 
* @param {string} url 发送请求的url 
* @param {Object} options 发送请求的选项参数 
* @config {String} [method] 请求发送的类型。默认为GET 
* @config {Boolean} [async] 是否异步请求。默认为true(异步) 
* @config {String} [data] 需要发送的数据。如果是GET请求的话,不需要这个属性 
* @config {Object} [headers] 要设置的http request header 
* @config {number} [timeout] 超时时间,单位ms 
* @config {String} [username] 用户名 
* @config {String} [password] 密码 
* @config {Function} [onsuccess] 请求成功时触发,function(XMLHttpRequest xhr, string responseText)。 
* @config {Function} [onfailure] 请求失败时触发,function(XMLHttpRequest xhr)。 
* @config {Function} [onbeforerequest] 发送请求之前触发,function(XMLHttpRequest xhr)。 
* 
* @meta standard 
* @see ajax.get,ajax.post 
* 
* @returns {XMLHttpRequest} 发送请求的XMLHttpRequest对象 
*/ 
var ajax = {}; 
ajax.request = function(url,options,type){ 
// 是否需要异步 
var async = options.async||true, 
// 用户名、密码 
username = options.username||"", 
password = options.password||"", 
// 需要传输的数据 
data = options.data||"", 
// GET还是POST 
method = (options.method||"GET").toUpperCase(), 
// 请求头 
headers = options.headers||{}, 
// 事件处理函数表 
eventHandler = {}, 
// 请求数据类型 
dataType = type||"string";//xml||string 
function stateChangeHandler(){ 
// 看看是否已经准备好了 
if(xhr.readyState == 4){ 
// 得到xhr当前状态 
var sta = xhr.status; 
// 判断是否成功 
if(sta == 200||sta == 304){ 
// 成功则触发成功 
fire("success"); 
}else{ 
// 失败则触发失败 
fire("failure"); 
} 
// 清除绑定 
window.setTimeout(function(){ 
xhr.onreadystatechange= new Function(); 
if (async){ 
xhr = null; 
} 
},0); 
} 
} 
function fire(type){ 
// 把type变成ontype 
type = "on"+type; 
// 在事件处理器表中找到对应事件的处理函数 
var handler = eventHandler[type]; 
// 如果函数存在,则 
if(handler){ 
// 不成功的话 
if(type != "onsuccess"){ 
handler(xhr); 
// 成功了 
}else{ 
// 则根据dataType返回不同的数据 
handler(xhr,dataType!="xml"?xhr.responseText:xhr.responseXML); 
} 
} 
} 
// 组装eventHandler 
for(var key in options){ 
eventHandler[key] = options[key]; 
} 
// 新建一个XMLHttpRequest对象 
var xhr = new XMLHttpRequest(); 
// 如果方法是GET,则把数据组装到url中 
if(method == "GET"){ 
url += (url.indexOf("?")>=0)?"&":"?"; 
url += data; 
// 清空data 
data = null; 
} 
// 如果是异步 
if (async){ 
// 绑定readystatechange的处理器 
xhr.onreadystatechange = stateChangeHandler; 
} 
// 看看是否需要输入密码 
if(username){ 
xhr.open(method,url,async,username,passowrd); 
}else{ 
xhr.open(method,url,async); 
} 
// 如果是POST 
if(method == "POST"){ 
// 设置一下请求头 
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
} 
// 把options中的请求头信息全部设置进去 
for(var key in headers){ 
xhr.setRequestHeader(name,headers[key]) 
} 
// 触发事件beforerequest 
fire("beforerequest"); 
// 发送数据 
xhr.send(data); 
// 如果不是异步 
if (!async){ 
// 则直接运行stateChangeHandler来处理数据 
stateChangeHandler(); 
} 
return xhr; 
}

这段代码还是比较容易理解的
•通过XMLHttpRequest()新建一个XMLHttpRequest对象。
•看看是GET,还是POST方式,如果是GET则组装url,如果是POST,设置一下请求头。
•看看是不是异步,如果是则注册监听函数stateChangeHandler。
•看看需不需要用户名和密码,执行open。
•发送请求。
•等待监听函数处理事件。
baidu.ajax.get & baidu.ajax.post
/** 
* 发送一个post请求 
* @name ajax.post 
* @function 
* @grammar ajax.post(url, data[, onsuccess]) 
* @param {string} url 发送请求的url地址 
* @param {string} data 发送的数据 
* @param {Function} [onsuccess] 请求成功之后的回调函数,function(XMLHttpRequest xhr, string responseText) 
* @meta standard 
* @see ajax.get,ajax.request 
* 
* @returns {XMLHttpRequest} 发送请求的XMLHttpRequest对象 
*/ 
ajax.post = function(url,data,onsuccess){ 
return ajax.request(url,{"data":data,"onsuccess":onsuccess,method:"POST"}); 
}

/** 
* 发送一个get请求 
* @name ajax.get 
* @function 
* @grammar ajax.get(url[, onsuccess]) 
* @param {string} url 发送请求的url地址 
* @param {Function} [onsuccess] 请求成功之后的回调函数,function(XMLHttpRequest xhr, string responseText) 
* @meta standard 
* @see ajax.post,ajax.request 
* 
* @returns {XMLHttpRequest} 发送请求的XMLHttpRequest对象 
*/ 
ajax.get = function(url,data,onsuccess){ 
return ajax.request(url,{"data":data,"onsuccess":onsuccess}); 
}

baidu.ajax.get和baidu.ajax.post都是通过baidu.ajax.request扩展的。
Javascript 相关文章推荐
Javascript 面向对象 继承
May 13 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
使用jQuery管理选择结果
Jan 20 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
Aug 25 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
Oct 19 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
jQuery实现内容定时切换效果完整实例
Apr 06 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
基于vue2实现上拉加载功能
Nov 28 Javascript
react native 获取地理位置的方法示例
Aug 28 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 Javascript
layui动态渲染生成select的option值方法
Sep 23 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
Jan 23 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
Jan 23 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
Jan 23 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
Jan 23 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
Jan 23 #Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
Jan 23 #Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
Jan 23 #Javascript
You might like
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
关于逃课的检讨书
2014/01/23 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
储备店长岗位职责
2015/04/14 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
心理学培训心得体会
2016/01/22 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android