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中强制执行toString()具体实现
Apr 27 Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 Javascript
JS OffsetParent属性深入解析
Jan 13 Javascript
js打开新窗口方法整理
Feb 17 Javascript
使用JQuery实现的分页插件分享
Nov 05 Javascript
js剪切板应用clipboardData实例解析
May 29 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
Dec 09 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
Easyui在treegrid添加控件的实现方法
Jun 23 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
JS数组splice操作实例分析
Oct 12 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 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 显示客户端IP与服务器IP的代码
2010/10/12 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
Dom 结点创建 基础知识
2011/10/01 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
Python实现自动上京东抢手机
2018/02/06 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
python实现马丁策略的实例详解
2021/01/15 Python
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
入党申请人的自我鉴定
2013/12/01 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
环保建议书作文400字
2015/09/14 职场文书
感谢信的技巧及范例
2019/05/15 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
vue3中provide && inject的使用
2021/07/01 Vue.js
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
Golang 字符串的常见操作
2022/04/19 Golang