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的文章
猜你喜欢
- 这里说的“相对路径”是相对于“主调文件”所在的文件夹。#include file #include file后面跟的是文件的“相对路径”,不
- 在程序的开发过程中,处理分页是大家接触比较频繁的事件,因为现在软件基本上都是与数据库进行挂钓的。但效率又是我们所追求的,如果是像原来那样把所
- 在广大网友心目中,他们就是中国互联网搜索领域的三驾马车。无论这三家搜索巨头承不承认,在网友眼中总会来将他们进行对比比较。当然,更多时候的比较
- 在前一文中记述了Access启动不了,或者出现“正在准备安装……”的问题,今天则找到了Access对控件支持的问题。本来Access、Exc
- Internet Explorer 8 Beta 测试了一年多之后,今天,IE8 终于发布了。它绝对好过 IE7,还有一些不错的新功能,如
- 1:为什么每个layout下都有个inlayout?我们将layout的宽/浮动等属性设置好之后,对于layout内的padding和mar
- 如何使用表单发送电子邮件?邮件也可以用表单格式发送吗?我见一个朋友这样做的。当然可以,用OCXMail就行:formToEmail.htm&
- 移动互联网被称为“第五次科技革命”,而随着iPhone和Android等智能手机的日渐流行和iPad等平板电脑的出现,移动互联网的潜力和趋势
- 使用ENUM代替字符串类型有时候, 可以通过使用ENUM来代理常规的字符串类型。一个ENUM列能够存储65535个不同的字符串值,MySQL
- MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型下面
- 近日,有朋友一直打听flash连结服务器相关的知识,搞得我忧心重重,重点是自己也忘记了,大部分Flash的相关开发都是两年前的事,而且fla
- 最近对 Range 和 Selection 比较感兴趣。基本非 IE 的浏览器都支持 DOM Level2 中的 Range,而 IE 中仅
- SQL*Plus system/manager 2、显示当前连接用户 SQL> show user 3、查看系统拥有哪些用户 SQL&
- 看到这个需求的时候就在暗爽,又可以搞定一个知识点了。哈哈,一天的奋斗之后,果然有所收获,而且经过怿飞的指点,在跨域问题解决上还有所突破(不通
- 问:如何在SQL Enterprise Manager version 6.5下操作SQL Server 6.0的服务器?答:在使用SQL
- 下面是虚机维护中,经常碰到的一些ASP程序中的数据库调用的错误,现收集整理如下:
- 这带来了很多好处,但是也要求学习一些新的概念、命令、使用和管理任务。所以在投入你的生产系统之前,看看它解决什么、管理什么,以及对它的正反面评
- 代码如下:USE [tempdb] GO /****** Object: UserDefinedFunction [dbo].[fun_ge
- 先使用 Ms Access 压缩修复,然后再去相关的表把备注类型的字段里的“索引”去掉 备注型字段为什么不能超过1950字节?是由于备注型字
- background-clip 和 background-origin 是 CSS3 中新加的 background module 属性,用