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 不间断的图片滚动并可点击
Jan 15 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
Aug 14 Javascript
Javascript 多浏览器兼容总结(实战经验)
Oct 30 Javascript
jquery下div 的resize事件示例代码
Mar 09 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
Jil,高效的json序列化和反序列化库
Feb 15 Javascript
老生常谈js-react组件生命周期
May 02 Javascript
详解create-react-app 自定义 eslint 配置
Jun 07 Javascript
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
javascript中关于类型判断的一些疑惑小结
Oct 14 Javascript
手把手教你如何编译打包video.js
Dec 09 Javascript
JS数组索引检测中的数据类型问题详解
Jan 11 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检测useragent版本示例
2014/03/24 PHP
php返回json数据函数实例
2014/10/09 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
jQuery中parents()方法用法实例
2015/01/07 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
vue多次循环操作示例
2019/02/08 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
工程造价自荐信
2013/10/09 职场文书
工程监理应届生求职信
2013/11/09 职场文书
个人租房协议书
2014/04/09 职场文书
家长对学生的评语
2014/04/18 职场文书
林肯就职演讲稿
2014/05/19 职场文书
大学活动总结模板
2014/07/10 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
500字小学生检讨书
2015/02/19 职场文书
学生保证书格式
2015/02/27 职场文书
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL
ant design charts 获取后端接口数据展示
2022/05/25 Javascript