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 相关文章推荐
js对象的构造和继承实现代码
Dec 05 Javascript
拥抱模块化的JavaScript
Mar 07 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
Jan 21 Javascript
JavaScript判断前缀、后缀是否是空格的方法
Apr 15 Javascript
js选择器全面解析
Jun 27 Javascript
使用Require.js封装原生js轮播图的实现代码
Jun 15 Javascript
bootstrap paginator分页前后台用法示例
Jun 17 Javascript
JavaScript实现换肤功能
Sep 15 Javascript
CKeditor4 字体颜色功能配置方法教程
Jun 26 Javascript
vue实现多组关键词对应高亮显示功能
Jul 25 Javascript
JS异步处理的进化史深入讲解
Aug 25 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
Aug 08 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 eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
小程序云开发实战小结
2018/10/25 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
幼儿园运动会口号
2014/06/07 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
python超详细实现完整学生成绩管理系统
2022/03/17 Python