jQuery的实现原理的模拟代码 -5 Ajax


Posted in Javascript onAugust 07, 2010
// 创建 XHR 对象 
var xhr; 
if (window.XMLHttpRequest) { 
xhr = new XMLHttpRequest(); 
} 
else if (window.ActiveXObject) { 
xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
} 
else { 
throw new Error("Ajax is not supported by this browser"); 
} 
function ready() 
{ 
alert("Start......"); 
// 通过事件来处理异步请求 
xhr.onreadystatechange = function() 
{ 
if( xhr.readyState == 4 ) 
{ 
alert( "Ready."); 
if( xhr.status == 200 ) 
{ 
alert("成功获得服务器返回的结果."); 
// 请求结束之后,可以获取服务器返回的内容 
alert( xhr.responseText ); 
// 获取服务器返回的 json 对象 
var alice = eval( "(" + xhr.responseText + ")" ); 
alert( alice.name ); 
} 
} 
}; 
// 设置请求参数 
xhr.open("get", "data.json" ); 
xhr.send( null ); 
}

jQuery 简单地包装了对 xhr 对象的使用,通过对 jQuery 对象增加常用的访问方法,然后,提供给 jQuery 对象来使用。
// 主要的扩展在 jQuery.ajax 中。 
jQuery.extend({ // #6299 
// 请求的默认参数 
ajaxSettings: { 
url: location.href, 
type: "GET", 
contentType: "application/x-www-form-urlencoded", 
data: null, 
xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? 
function () { 
return new window.XMLHttpRequest(); 
} : 
function () { 
try { 
return new window.ActiveXObject("Microsoft.XMLHTTP"); 
} catch (e) { } 
} 
}, 
// 用来设置 jQuery.ajaxSettings ,设置请求的参数 
ajaxSetup: function (settings) { 
jQuery.extend(jQuery.ajaxSettings, settings); 
}, 
ajax: function (origSettings) { // 实际的 ajax 函数 
var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings); 
// 创建 xhr 对象 
xhr = s.xhr(); 
// 回调函数 
var onreadystatechange = xhr.onreadystatechange = function (isTimeout) { 
if (xhr.readyState === 4) { 
if (xhr.status == 200) { 
s.success.call(origSettings, xhr.responseText); 
} 
} 
}; 
// 设置请求参数 
xhr.open(s.type, s.url); 
// Send the data 发出请求 
xhr.send(s.data); 
// return XMLHttpRequest to allow aborting the request etc. 
return xhr; 
}, 
// 使用 get 方式发出 ajax 请求的方法 
get: function (url, data, callback, type) { 
// shift arguments if data argument was omited 
if (jQuery.isFunction(data)) { 
type = type || callback; 
callback = data; 
data = null; 
} 
return jQuery.ajax({ 
type: "GET", 
url: url, 
data: data, 
success: callback, 
dataType: type 
}); 
} }); // #6922 
// 扩展 jQuery 对象,增加 load 方法 
jQuery.fn.extend( 
{ 
load: function (url) { 
var self = this; 
jQuery.get(url, function (data) { 
self.each(function () { 
this.innerHTML = data; 
} 
) 
} 
) 
} 
} 
)

在页面中,可以如下使用。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title></title> 
</head> 
<body> 
<input type="button" id="btn" value="Click me" /> 
<div id="msg"> 
</div> 
<script src="jQuery-core.js" type="text/javascript"></script> 
<script src="jQuery-event-2.js" type="text/javascript"></script> 
<script src="jQuery-data.js" type="text/javascript"></script> 
<script src="jQuery-extend.js" type="text/javascript"></script> 
<script src="jQuery-ajax.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$("#btn").click(function () { 
$("#msg").load("hello.txt"); 
}) </script> 
</body> 
</html>
Javascript 相关文章推荐
Javascript实现关联数据(Linked Data)查询及注意细节
Feb 22 Javascript
jQuery toggleClass应用实例(附效果图)
Apr 06 Javascript
ExpressJS入门实例
Jan 14 Javascript
javascript 数组去重复(在线去重工具)
Dec 17 Javascript
微信小程序 常用工具类详解及实例
Feb 15 Javascript
JS HTML图片显示Canvas 压缩功能
Jul 21 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
Jul 27 Javascript
javascript 开发之网页兼容各种浏览器
Sep 28 Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 jQuery
vue2.0 实现富文本编辑器功能
May 26 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 06 Javascript
如何区分vue中的v-show 与 v-if
Sep 08 Javascript
javascript new fun的执行过程
Aug 05 #Javascript
过虑特殊字符输入的js代码
Aug 05 #Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
Aug 05 #Javascript
javascript new后的constructor属性
Aug 05 #Javascript
FileUpload上传图片(图片不变形)
Aug 05 #Javascript
JavaScript中关于indexOf的使用方法与问题小结
Aug 05 #Javascript
js继承的实现代码
Aug 05 #Javascript
You might like
php数字转汉字代码(算法)
2011/10/08 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
php实现json编码的方法
2015/07/30 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
Python3搜索及替换文件中文本的方法
2015/05/22 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
Python图片的横坐标汉字实例
2019/12/04 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
一套Delphi的笔试题二
2013/05/11 面试题
幼师专业毕业生自荐信
2013/09/29 职场文书
完美主义个人的自我评价
2014/02/17 职场文书
行政主管职责范本
2014/03/07 职场文书
村干部承诺书
2014/03/28 职场文书
校庆标语集锦
2014/06/25 职场文书
消防隐患整改通知书
2015/04/22 职场文书