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的文章


猜你喜欢
- 在Google Chrome浏览器出来之前,我一直使用FireFox,因为FireFox的插件非常丰富,更因为FireFox有强大的Fire
- 一、创建数据表1、基本语法create table 表名 ( 字段名 字段类型 [字段属性], &n
- 一、作业回顾1、格式化输出与%百分号以下结果中,可以正常输出“50%及格”语句是(B)A、print
- 本文实例讲述了JS数组中对象去重操作。分享给大家供大家参考,具体如下:<!DOCTYPE html><html lang=
- 一.基本概念事务是指满足ACID特性的的一组操作,可以通过Commit提交事务,也可以也可以通过Rollback进行回滚。会存在中间态和一致
- 最近做了一个前端项目,其中有需求:通过button直接把input或者textarea里的值复制到粘贴板里。下面小编把我实现思路及代码分享给
- Bootstrap简介Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JA
- 背景:有一个list,里面的每一个元素都是dict,根据某一个key进行去重,在这里,key代表question#!/usr/bin/env
- 忙碌了一年,今天终于放假了。原本打算好好休息一下,没成想只过了半天就觉得有点无聊。看家人和朋友们都在忙年,那我就用OpenGL导演一场烟花盛
- 1、用apt-get安装mysql#更新一下apt 仓库sudo apt-get update#安装mysql-servicesudo ap
- 1、说明curses提供了内置颜色可以让我们自定义前后背景。在使用彩色模式之前我们需要先使用使用curses.start_corlor()进
- 1.图片分类网络这是一个二分类网络,可以是alxnet ,vgg,resnet任何一个,负责对图片进行二分类,区分图片是真实图片还是生成的图
- pytorch中如果自己搭建网络并且加载别人的与训练模型的话,如果模型和参数不严格匹配,就可能会出问题,接下来记录一下我的解决方法。两个有序
- 昨天在得写“RSS收藏”栏目展现的时候我让RSS的列表用弹出的形式展现了,开始是直接的控制 style.display 来做的,但是感觉有点
- Microsoft JET Database Engine 错误 '80040e2
- 首先, 补充下对node 的理解:nodeJs 是一个单进程单线程应用程序, 但是通过事件和回调支持并发, 所以性能非常高~那么什么是单进程
- 此段代码可以利用剪切板,完成自动复制粘贴等功能。(Windows) import sysimport os.pathimport
- ASP的强大不仅仅局限于接受和显示的交互,更多的是运用ActiveX 组件进行更强大的Web应用。那究竟ActiveX组件为何物?
- asp之家注:为什么要防止访客频繁刷新页面呢?也许你会说他想刷新就让他刷新吧,没什么关系,而且还增加了网页的PV,呵呵。但是有的页面我们可能
- 一、插入排序插入排序与我们平时打扑克牌非常相似,将新摸到的牌插入到已有的牌中合适的位置,而已有的牌往往是有序的。1.1 执行流程(1)在执行