jQuery中$.ajax的实现解析

作者:Robin 来源:Rlog 时间:2008-07-20 13:11:00 

// 执行AJAX请求的通用函数
//带一个参数,是包含一系列选项的对象
function ajax(options){
//如果用户没有提供某个选项则用默认值代替
options = {
//HTTP请求的类型
type: options.type || “POST”,
//请求的URL
url: options.url || “”,
//请求超时时间
timeout: options.timeout || 5000,
//请求失败,成功或完成(无论成功或者失败都会执行)时执行的函数
onComplete: options.onComplete ||
function(){},
onError: options.onError ||
function(){},
onSuccess: options.onSuccess ||
function(){},
//服务器返回的数据类型,这一默认值用于判断服务器返回的数据并做相应动作
data: options.data || “”
};

//创建请求对象
var xml = new XMLHttpRequest();
//初始化异步请求
xml.open(options.type, options.url, true);
//我们在请求后等待5秒,超时则放弃
var timeoutLenght = options.timeout;

//记录请求是否成功完成
var requestDone = false;

// 初始化一个5秒后执行的回调函数,用于取消请求 (如果尚未完成的)
setTimeout(function(){
var requestDone = true;
}, timeoutLenght);

// 监听文档状态的更新
xml.onreadystatechange = function(){
//保持等待,直到数据完全加载,并保证请求未超时
if (xml.readyState == 4 && !requestDone) {
//检查是否请求成功
if (httpSuccess(xml)) {
//以服务器返回的数据作为参数调用成功回调函数
options.onSuccess(httpData(xml, options.type));
}
else {
options.onError();
}
//调用完成回调函数
options.onComplete();
//为避免内存泄漏,清理文档
xml = null;
}
};

//建立与服务器连接
xml.send();

//判断HTTP响应是否成功
function httpSuccess(r){
try {
//如果得不到服务器状态,且我们正在请求本地文件,认为成功
return !r.status && location.protocol == “file:” ||

//所有200到300间的状态表示为成功
(r.status >= 200 && r.status < 300) ||

//文档未修改也算成功
r.status == 304 ||

//Safari 在文档未修改时返回空状态
navigator.userAgent.indexOf(“Safari”) >= 0 && typeof r.status == “undefined”;
}
catch (e) {
}
//若检查状态失败,就假定请求是失败的
return false;
}

//从HTTP响应中解析正确的数据
function httpData(r, type){
//获取 content-type 的首部
var ct = r.getResponseHeader(“content-type”);

//若是没有提供默认的类型,判断服务器返回的是否是xml形式
var data = !type && ct && ct.indexOf(“xml”) >= 0;

//若是,获得xml文档对象,否则返回文本内容
data = type == “xml” || data ? r.responseXML : r.responseText;

//若指定类型是“script”,则以Javascript形式执行返回文本
if (type == “script”)
eval.call(window, data);
//返回响应数据(或为XML文档,或为文本字符串)
return data;

}
}

更多关于Jquery的文章

标签:jQuery,ajax,javascript
0
投稿

猜你喜欢

  • 基于Python中的turtle绘画星星和星空

    2022-10-31 08:57:41
  • mysql基于正则实现模糊替换字符串的方法分析

    2024-01-25 05:47:36
  • [译]“我心中的ebay”

    2008-06-04 12:09:00
  • 网站大改版=壮烈的死亡 ?

    2009-04-03 14:09:00
  • Go语言copy()实现切片复制

    2024-05-25 15:12:43
  • 5分钟了解MySQL5.7中union all用法的黑科技

    2024-01-22 16:53:00
  • 详解Python 字符串相似性的几种度量方法

    2023-06-19 14:12:39
  • python进阶教程之文本文件的读取和写入

    2023-08-03 03:27:47
  • python爬虫之爬取百度音乐的实现方法

    2022-09-02 06:22:10
  • 教你用Python寻找重复文件并删除的脚本写法

    2023-08-21 19:33:43
  • Python+Tkinter制作猜灯谜小游戏

    2021-09-24 19:43:17
  • Mysql全局ID生成方法

    2023-07-02 13:59:53
  • Python实现聊天机器人的示例代码

    2022-11-16 18:10:56
  • python logging日志模块的详解

    2021-04-27 19:16:55
  • Python集合set的交集和并集操作方法

    2023-12-25 17:35:56
  • this.clientWidth和this.offsetWidth两个有什么不同

    2024-04-22 22:25:16
  • python获取全国城市pm2.5、臭氧等空气质量过程解析

    2023-06-04 21:46:07
  • Vue2 响应式系统之深度响应

    2024-04-26 17:40:05
  • 价值3亿美元的按钮[译]

    2009-03-18 19:39:00
  • python基础教程之csv文件的写入与读取

    2021-06-18 21:21:00
  • asp之家 网络编程 m.aspxhome.com