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 相关文章推荐
js的闭包的一个示例说明
Nov 18 Javascript
Jquery中增加参数与Json转换代码
Nov 20 Javascript
javascript中的数字与字符串相加实例分析
Aug 14 Javascript
写出高效jquery代码的19条指南
Mar 19 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
javascript中Array()数组函数详解
Aug 23 Javascript
jquery.cookie实现的客户端购物车操作实例
Dec 24 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
May 26 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
Oct 20 Javascript
Vue拖拽组件列表实现动态页面配置功能
Jun 17 Javascript
微信小程序制作扭蛋机代码实例
Sep 24 Javascript
关于小程序优化的一些建议(小结)
Dec 10 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-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
php微信公众号开发之简答题
2018/10/20 PHP
Javascript模板技术
2007/04/27 Javascript
js 方法实现返回多个数据的代码
2009/04/30 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
WEB前端设计师常用工具集锦
2014/12/09 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
js实现简单的倒计时
2021/01/28 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
wxPython使用系统剪切板的方法
2015/06/16 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
使用python实现knn算法
2017/12/20 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Python PIL库图片灰化处理
2020/04/07 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Python面向对象实现方法总结
2020/08/12 Python
python实现画图工具
2020/08/27 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
竟聘演讲稿范文
2013/12/31 职场文书
创业计划书撰写原则
2014/01/25 职场文书
大学秋游活动方案
2014/02/11 职场文书
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript