jQuery调用AJAX异步操作超清晰教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JQUERY AJAX异步操作详细说明
AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和XML)。
它并非一种新的技术,而是以下几种原有技术的结合体。
1)使用CSS和XHTML来表示。
2)使用DOM模型来交互和动态显示。
3)使用XMLHttpRequest来和服务器进行异步通信。
4)使用javascript来绑定和调用。
通过AJAX异步技术,可以在客户端脚本与web服务器交互数据的过程中使用XMLHttpRequest对象来完成HTTP请求(Request)/应答(Response)模型:
1)不需要用户等待服务端响应。
在异步派发XMLHttpRequest请求后控制
权马上就被返回到浏览器。
界面不会出现白板,在得到服务器响应之前
还可以友好的给出一个加载提示。
2)不需要重新加载整个页面。
为XMLHttpRequest注册一个回调函数,待
服务器响应到达时,触发回调函数,并且传递所需的少量数据。
“按需
取数据”也降低了服务器的压力。
3)不需要使用隐藏或内嵌的框架。
在XHR对象之前,模拟Ajax通信通常
使用hack手段,如使用隐藏的或内嵌的框架(<iframe>标签)。
下面介绍下AJAX中的重要对象:XMLHttpRequest。
XMLHttpRequest对象(XHR)
XMLHttpRequest是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或接收XML及其他数据的一套API。
XMLHttpRequest对象首次以ActiveX对象形式在微软Internet Explorer(IE) 5中以引入。
其他浏览器制造商在认识到这一对象重要性后也纷纷实现了XMLHttpRequest对象,但是以一个本地JavaScript对象而不是作为一个ActiveX 对象实现。
而如今,由于安全性、标准等问题,微软已经在其IE 7中把XMLHttpRequest实现为一个本地JavaScript对象。
API描述
客服端请求
open(method,url,a sync, bstrUser, bstrPassword)规定请求的类型、URL 以及是否异步处理请求。
1)method:请求的类型,例如:POST、GET、PUT及PROPFIND。
大小写不敏感。
2)url:请求的URL地址,可以为绝对地址也可以为相对
地址。
3)async[可选]:true(默认,异步)或 false(同步)。
注释:当您使用async=false 时,JavaScript 会等到服务器响应就绪才继续执行。
如果服务器繁忙或缓慢,应用程序会挂起或停止。
此时,不需要编写onreadystatechange回调函数,把代码放到send() 语句后面即可。
4)bstrUser[可选]:如果服务器需要验证,此处指定用
户名,如果未指定,当服务器需要验证时,会弹出验证
窗口。
5)bstrPassword[可选]:验证信息中的密码部分,如果
用户名为空,则此值将被忽略。
getRequestHeader(
name)
获取指定的相应头部信息
setRequestHeader( name,value)自定义HTTP头部信息。
需在open()方法之后和send()之前调用,才能成功发送请求头部信息。
传送门:HTTP 头部详解
Accept浏览器能够处理的媒体类型
Accept-Chars
et
浏览器申明自己接收的字符集
Accept-Encod
ing
浏览器申明自己接收的编码方法,通常
指定压缩方法,是否支持压缩,支持什
么压缩方法(gzip,deflate)
Host客户端指定要请求的WEB服务器的域
名/IP 地址和端口号
Referer发出请求的页面的URI
Content-Type标明发送或者接收的实体的MIME类
型。
传送门:
1、HTTP Content-type对照表
2、格式:Content-Type:
[type]/[subtype]; parameter
X-Requested-
With
非标准HTTP头,只为firefox3标注是
否为ajax异步请求,null表示为同步
请求。
默认情况下,服务器对POST请求和提交Web表单不会一视同仁,将Content-Type头部信息设置为application/x-www-form-urlencoded (模拟表单提交)
send(string)将请求发送到服务器。
参数string仅用于POST请求;对
于GET请求的参数写在url后面,所以string参数传递
null。
abort()调用此方法可取消异步请求,调用后,XHR对象停止触发事
件,不允许访问任何与响应相关的属性;
服务端响应
onreadystatechang e事件对于异步请求,如果需要对服务器获取和操作响应结果,则在send() 之前,需要为onreadystatechange属性指定处理方法。
该函数用于对服务器响应进行处理。
readyState存有XMLHttpRequest的状态。
每当readyState改变时,
就会触发onreadystatechange事件。
从 0 到 4 发生变化:
0(未初始化)对象已建立,但是尚未初始化(尚未
调用open方法)
1(初始化)对象已建立,尚未调用send方法
2(发送数据)send方法已调用,但是当前的状态及
http头未知
3(数据传送中)已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误
4(完成)数据接收完毕,此时可以通过
responseXml和responseText获取完
整的回应数据
status(数字表示)返回当前请求的http状态码。
传送门:HTTP状态码一览表(HTTP Status Code)
1xx(临时响应)表示临时响应并需要请求者继续执
行操作的状态代码。
2xx (成功)表示成功处理了请求的状态代码。
Eg:200
3xx (重定向)表示要完成请求,需要进一步操作。
通常,这些状态代码用来重定向。
Eg:304
4xx(请求错误)这些状态代码表示请求可能出错,
导致服务器无法正常处理。
Eg:404
5xx(服务器错误)这些状态代码表示服务器在尝试处
理请求时发生内部错误。
这些错误
可能是服务器本身的错误,而不是
请求出错。
Eg:500
statusText(字符表
示)
返回当前请求的状态文本eg:OK (status:200)responseText将响应信息作为字符串返回
responseXML将响应信息格式化为Xml Document对象并返回
responseBody(只有微软的IE支持)将响应信息正文以unsigned byte数组形式返回(二进制数据)
responseStream(只
有IE的某些版本支
持)
以Ado Stream对象(二进制流)的形式返回响应信息
getResponseHeader
(name)
从响应信息中获取指定的http头
getAllResponseHea
ders()
获取响应的所有http头
overrideMimeType通常用于重写服务器响应的MIME类型。
Eg,正常情况下
XMLHttpRequest只接收文本数据,但我们可以重写MIME
为“text/plain; charset=x-user-defined”,以欺骗浏
览器避免浏览器格式化服务器返回的数据,以实现接收二
进制数据。
XMLHttpRequest Level 2
XMLHttpRequest是一个浏览器接口,使得Javascript可以进行 HTTP (S) 通信。
但是,这个接口一直没有标准化,每家浏览器的实现或多或少有点不同。
HTML 5 的概念形成后,W3C 开始考虑标准化这个接口。
2008年 2 月,提出了XMLHttpRequest Level 2 草案。
1.老版本的缺点
老版本的XMLHttpRequest对象有以下几个缺点:
1)只支持文本数据的传送,无法用来读取和上传二进制文件。
2)传送和接收数据时,没有进度信息,只能提示有没有完成。
3)受到"同域限制"(Same Origin Policy),只能向同一域名的服务器请
求数据。
2.新版本的功能
新版本的XMLHttpRequest对象,针对老版本的缺点,做出了大幅改进。
1)可以设置 HTTP 请求的时限。
2)可以使用FormData对象管理表单数据。
3)可以上传文件。
4)可以请求不同域名下的数据(跨域资源共享,Cross-origin resource
sharing,简称 CORS)。
5)可以获取服务器端的二进制数据。
6)可以获得数据传输的进度信息。
3.介绍几个XMLHttpRequest Leve2 新增的成员
超时时限
timeout设置ajax请求超时时限,过了这个时限,就自动停止
HTTP请求。
ontimeout事件当ajax超过timeout 时限时触发的回调函数。
指定响应格式
responseType(默认:“text”)在发送请求前,根据您的数据需要,将
xhr.responseType设置为“text”、“arraybuffer”、
“blob”或“document”。
response成功发送请求后,xhr的响应属性会包含DOMString、
ArrayBuffer、Blob 或Document 形式(具体取决于
responseTyp的设置)的请求数据。
进度信息
progress 事件在XMLHttpRequest对象传递数据的时候用来返回进度信
息。
它分成上传和下载两种情况。
下载的 progress 事件
属于XMLHttpRequest对象,上传的 progress 事件属于
XMLHttpRequest.upload 对象。
即:
xhr.onprogress = updateProgress;
xhr.upload.onprogress = updateProgress;
XHR 还新增了与progress 事件相关的五个事件:
1) load 事件:传输成功完成。
2) abort 事件:传输被用户取消。
3) error 事件:传输中出现错误。
4) loadstart 事件:传输开始。
5) loadEnd 事件:传输结束,但是不知道成功还是失败。
4. 一个新功能实例
1) 接收二进制数据(方法A :改写MIMEType )
老版本的XMLHttpRequest 对象,只能从服务器取回文本数据。
但我
们可以改写数据的MIMEType ,将服务器返回的二进制数据伪装成文本数据,并且告诉浏览器这是用户自定义的字符集。
关键代码如下:
服务端
?
1 2 3 4 5 6 7 8 9 10 11
String str ="二进制数据获取"; MemoryStream _memory =new MemoryStream(); BinaryFormatter formatter =new BinaryFormatter(); formatter.Serialize(_memory, str); _memory.Position = 0; byte [] read =new byte [_memory.Length]; _memory.Read(read, 0, read.Length); _memory.Close(); context.Response.ContentType ="text/plain"; // 服务器使用OutputStream 输出二进制流 context.Response.OutputStream.Write(read, 0, read.Length); 客服端
?
1 2 3 4 5 6 7 8 9 10 $('#btn_mime').bind('click',null
,function () {
$.ajax('AjaxHandler.ashx?func=GetBinaryData',
{
type:'get',
dataType:'text',
cache:false ,
mimeType:'text/plain; charset=x-user-defined',
success:function (data) {
if (data) {
var byte = [];
1 1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 2 0for (var i = 0, len = data.length; i < len; ++i) { var c = data.charCodeAt(i);
byte[byte.length] = c & 0xff;
}
alert(byte);
}
}
});
});
浏览器会把相应数据当做文本数据接收,所以我们还必须再一个个字节地还原成二进制数据。
位运算"c & 0xff",表示在每个字符的两个字节之中,只保留后一个字节,将前一个字节扔掉。
原因是浏览器解读字符的时候,会把字符自动解读成Unicode 的 0xF700-0xF7ff 区段。
截图如下:(测试环境:google Chrome 版本 26.0.1410.43)
服务器端返回二进制数据:
客服端输出:
a)使用mimeType: 'text/plain; charset=x-user-defined'参数。
b)没有对服务器的MIME类型进行重写,导致返回信息被浏览器格式化
后输出的二进制数据与服务器不同。
并且不同浏览器格式化后输出
的二进制数据都有差异。
2)接收二进制数据(方法B:responseType属性)
在XMLHttpRequest Level2中,可以使用新增的responseType 属性
从服务器取回二进制数据。
把responseType 设为 blob ,表示服务器传回的是二进制对象。
?
1 2 3 var xhr =new XMLHttpRequest(); xhr.open ('GET','/path/to/image.png'); xhr.responseType ='blob';
接收数据的时候,用浏览器自带的 Blob 对象即可。
注意,读取的xhr.response ,而不是xhr.responseText 。
?
1 var blob =new Blob ([xhr.response], {type:'image/png'});
还可以将responseType 设为arraybuffer ,把二进制数据装在一个数组里。
然后再遍历这个数组。
?
1 2
3 4 5 6 7 8 9 10 var xhr =new XMLHttpRequest ();
xhr.open ('GET','/path/to/image.png'); xhr.responseType ="arraybuffer";
var arrayBuffer = xhr.response;
if (arrayBuffer) {
var byteArray =new Uint8Array (arrayBuffer);
for (vari = 0; i<byteArray.byteLength; i++) {
// do something
}
}
5. 更多XMLHttpRequest Level 2新功能描述请看:
1) XMLHttpRequest 增强功能
2) XMLHttpRequest Level 2 使用指南
3) XMLHttpRequest2 新技巧
jQuery 框架的Ajax
jQuery 是一个快速、简单的JavaScript library ,核心理念是write less,do more(写的更少,做的更多)。
它简化了HTML 文件的traversing ,事件处理、动画、Ajax 互动,从而方便了网页制作的快速发展。
jQuery 是为改变你编写JavaScript 的方式而设计的。
更多jQuery 科普知识请看:jQuery 百度百科(Eg :模块,历史版本)
下面介绍下jQuery 框架中ajax 相关API:
版本
Jquery-1.7.1.js 。
1. jQuery.ajax( [url,] options )
通过 HTTP 请求加载远程数据。
返回值:$.ajax() 返回jqXHR对象(jqXHR对象:为XMLHttpRequest对象的超集)。
大多数情况下你无需直接操作该对象,但特殊情况下可
用于手动终止请求abort()。
ajax内部实现的两个重要对象:s对象和jqXHR对象。
1)s对象
由默认设置jQuery.ajaxSettings对象、options参数集合和jQuery.ajaxSetup({})默认设置合并而成s对象。
参数
名
描述
可由ajax的options参数设置
url(默认: 当前页地址) 要请求的目的URL地址。
user
name
pass
word
用于响应HTTP访问认证请求的用户名及密码
type(默认: "GET") 请求方式 ("POST" 或 "GET")。
注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
data Type 预期服务器返回的数据类型。
如果不指定,jQuery将自动根据 HTTP 包MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。
随后服务器端返回的数据会根据这个值解析后,传递给回调函数。
必须确保网页服务器报告的 MIME 类型与我们选择的dataType所匹配。
比如说,XML的话,服务器端就必须声明text/xml 或者application/xml 来获得一致的结果。
可用值:
"xml
"
返回 XML 文档,
可用jQuery处理。
"htm
l"
返回纯文本 HTML
信息;包含的
script标签会在
插入dom时执行。
"scr
ipt"
返回纯文本
JavaScript 代
码,常常用于跨域
请求。
不会触发全
局事件和局部事
件;只支持GET方
式(POST请求会自
动转化为GET请
求);默认不启用
缓存
(cache:false)
"jso n"返回 JSON 数据。
JSON 数据是一种能很方便通过JavaScript 解析的结构化数据。
"jso np"JSONP 格式,用于跨域请求。
"tex t"返回纯文本字符串
其中,text 和 xml 类型返回的数据不会经过处理。
数据仅仅简单的将XMLHttpRequest的responseText或responseHTML属性传递给 success 回调函数。
如果指定了 script 或者jsonp类型,那么当从服务器接收到数据时,实际上是用了<script>标签而不是XMLHttpRequest对象。
这种情况下,$.ajax() 不再返回一个XMLHttpRequest对象,并且也不会传递事件处理函数,比如beforeSend。
cont entT ype (默认: "application/x-www-form-urlencoded")标明发送或者接收的实体的MIME类型。
当“非GET或HEAD请求”的HTTP请求时,会被设置为HTTP头请求信息。
mime Type 多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions);用于重写服务器端响应的MIME类型。
data发送到服务器的数据。
可以是一个查询字符串,比如key1=value1&key2=value2 ,也可以是一个映射,比如{key1: 'value1', key2: 'value2'} 。
如果使用了后者的形式,则数据在发送前
会通过jQuery.param()函数转换成查询字符串。
这个处理过程也可以通过
设置processData选项为false来回避。
proc essD ata (默认: true) 默认情况下,发送到服务器的数据(即data参数)将被转换为字符串以配合默认内容类型"application/x-www-form-urlencoded"。
如果要发送 DOM 树信息或其它不希望转换的信息,请设置为false。
jQuery中的处理方式:
?
1
2
3
if
( s.data&&s.processData&&ty
peofs.data !=="string" ) {
s.data =
jQuery.param(s.data,
s.traditional );
}
asyn c (默认: true) 默认设置下,所有请求均为异步请求。
如果需要发送同步请求,请将此选项设置为 false。
注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。
time
out
设置请求超时时间(毫秒)。
通过setTimeout(fn,time)实现。
cach e (默认: true)dataType为 script 和jsonp时默认为 false。
设置为false 将不缓存此页面。
当使用GET或HEAD方式发送请求时要添加时间戳参数(net Date()).getTime() 来保证每次发送的URL不同, 可以避免浏览器缓存.(只有GET和HEAD方式的请求浏览器才会缓存)
jQuery中的处理方式:
?
1
2
3
4
5
6
7
if ( s.cache ===false ) {
var ts = jQuery.now(),
// rts = /([?&])_=[^&]*/
尝试替换
ret =
s.url.replace( rts,"$1_=" +
ts );
// rquery = /\?/如果没有替
换任何内容,则把时间戳加到url最
后
s.url = ret + ( ( ret ===
s.url ) ?
( rquery.test( s.url ) ?"&"
:"?" ) +"_=" + ts :"" );
}
示例:/AjaxHandler.ashx?func=GetBinaryData&_=1368424995535
ifMo difi ed
(默认: false) 仅在服务器数据改变时获取新数据。
通过响应头If-Modified-Since、IF-None-Match和请求头Last-Modified、Etag提高GET或HEAD方式请求效率。
(只有GET和HEAD方式的请求浏览器才会缓存)
glob al (默认: true) 是否触发全局 AJAX 事件。
设置为 false 将不会触发全局AJAX 事件:ajaxStart、ajaxSend、ajaxSuccess、ajaxError、ajaxComplete、ajaxStop。
(比如请求频繁时可禁用全局AJAX事件提高效率)
cont ext (默认:true) 这个对象用于设置Ajax相关回调函数的上下文,让回调函数内this指向这个对象。
如果不设定这个参数,那么回调函数中的this 就指向调用本次AJAX请求时传递的options参数载体“s对象”。
但对于全局Ajax事件来说,this都是指向全局事件所绑定的元素。
json p 指定获得jsonp回调函数名的参数名(默认为:callback)。
这个值用来替代URL中"callback=?"里的"callback"部分,比如{jsonp:'onJsonPLoad'}会替换为将"onJsonPLoad=?"传给服务器。
json pCal lbac 为jsonp请求指定一个回调函数名。
jsonpCallback参数一般为字符串,也可接收函数(该函数返回字符串)。
默认情况下生成随机函数名:"jQuery" + ( jQuery.fn.jquery +
k Math.random() ).replace( /\D/g, "" ) + jQuery.now()
cros sDom ain (默认:null)true:同域请求;false跨域请求。
倘若crossDomain标识为null,则jQuery会自动根据本地url、端口来解析。
可以根据需求直接赋值来提高性能。
通常情况下由服务器自动解析即可,但如果你想在同一域中强制跨域请求(像JSONP一样),那么将crossDomain为true,这允许你将服务器端重定向到另一个域。
scri ptCh arse t 只有当请求时dataType为"jsonp"或"script",并且type是"GET"才会用于修改charset。
因为此时是动态创建<script>来完成脚本加载,但是如果js中的编码与页面的编码不一致时,js可能加载失败或者显示乱码或者IE下报某符号错误。
设置此参数就相当于为<script>标签设置charset属性。
hear ders (默认:{}) 设置HTTP请求头数据"{键:值}"。
此设置发生在:jQuery所有影响HTTP头的参数(options)设置之后,beforeSend回调函数之前。
stat usCo de (默认:{}) 定义一组HTTP状态码与回调函数的映射,当响应的状态码有匹配statusCode则会触发对应回调函数。
例如,如果响应状态是404,将触发以下警报:
?
1
2
3
4
5
$.ajax({
statusCode:
{404:function() {
alert('page not
found');
}
});
trad itio nal 如果你想要用传统的方式来序列化数据,那么就设置为true。
请参考$.param()深度递归详解。
xhrF ield s 声明附加到XMLHttpRequest对象的自定义“key-value”数组。
例如,如果需要的话,你可以用它来设置跨域的withCredentials为true,即:xhrFields: { withCredentials: true }
5个局部事件beforeSend、dataFilter、success、error、complete。
(详见后面事件介绍部分)
由ajax函数内部解析或内部提供
dataTypes由dataType按空格拆分所得。
isLocal根据协议确定当前url请求的是否为本地请
求。
jQuery中定义默认值为:
?
1isLocal:/^(?:about|app|app
\-storage|.+\-extension|fi le|res|widget):$/.test(/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/.exec(u rl))
hasContent 非GET 或HEAD 请求为true ,用于处理data 和contentType 参数。
contents
一个"{类型字符串:正则表达式}"的对象,倘若dataTypes[0]为“*”时,用contents 中的正则表达式去匹配contentType ,匹配成功则用“类型字符串”覆盖dataTypes[0]。
jQuery 内部定义如下:
?
1 2 3 4 5 6 contents: { xml: /xml/, html: /html/, json: /json/, script:
/javascript|ecmascript/ }
accepts
浏览器能够处理的媒体类型,其值取决于dataTypes[0]参数。
jQuery 内部定义如下:
?
1 2 3 4 5 6 7 8 accepts: {
xml:"application/xml, text/xml",
html:"text/html", text:"text/plain", json:"application/json, text/javascript",
script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript", "*": allTypes // dataTypes[0]匹配不上时取此值 }
responseFields jqXHR 超集设置“数据类型:属性”对应关
系,在返回响应数据时,用于确定创建哪个属性变量。
jQuery 中定义如下:
?
1
2
3 4 responseFields: { xml:"responseXML", text:"responseText" }
converters
存储数据类型对应的转换器,根据dataTypes 获取对应转换器,用于对响应数据response 进行处理。
该处理发生在dataFilter 回调函数之后。
?
1
2
3
4
5
6
7
8
9
1
converters: {
"* text": window.String, "text html":true , "text json": jQuery.parseJSON, "text xml": jQuery.parseXML, "text script":function ( text ) { jQuery.globalEval( text ); // 执行脚本 return text; } }
2) jqXHR 对象
为不同浏览器内置的XMLHttpRequest 提供了一致的超集。
对于XMLHttpRequest 之外的传输机制,比如JSONP 请求,jXHR 对象也可以进行处理。
超集与真子集:
如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S1就是S2的一个超集。
S1是S2的超集,则S2是S1的真子集,反之亦然。
jqXHR 对象我们常常使用如下成员,这些成员主要用于ajax 的全局事件和局部事件,并且做为$.ajax()函数返回值返回。
?
1 2 3 4 5 6 7 8 9 10 jqXHR:{ readyState
,setRequestHeader:function ( name, value ) ,getAllResponseHeaders:function () ,getResponseHeader:function ( key ) ,overrideMimeType:function ( type ) ,abort:function ( statusText ) ,responseText ,responseXML }
另外,jqXHR 的全部成员如下:
2. jQuery Ajax 事件
jQuery 框架中,伴随Ajax 请求会触发若干事件,我们可以订阅这些事件并在其中处理我们的逻辑。
在jQuery 中有两种Ajax 事件:局部事件和全局事件。
1) 局部事件(回调函数),在$.ajax()方法的options 参数中声明,可以
用来设置请求数据和获取、处理响应数据。
before Send 该函数可在发送请求前修改XMLHttpRequest 对象,如添加自定义 HTTP 头。
签名:function (jqXHR,s) { } 函数说明:传入jqXHR 、s 对象
dataFi
lter
在请求成功之后调用。
若状态码为304(未修改)则不触发此回调。
签名:function (data, dataType) { return newData; } 函数说明:传入返回的数据、"dataType"参数的值。
并且必须返回新的数据传递给success 回调函数
succes s 请求成功时触发。
签名:function (data,statusText,jqXHR) { }
函数说明:传入返回的数据、描述状态的字符串”success”、jqXHR 对象
error 请求失败时调用此函数。
签名:function (jqXHR, textStatus, errorThrown) { } 函数说明:传入jqXHR 对象、描述状态的字符串”error”、错误信息
comple te 请求完成后回调函数 (请求成功或失败之后均调用) 签名:function (jqXHR, textStatus) { }
函数说明:传入jqXHR 对象、描述状态的字符串(可能值:"No Transport"、"timeout"、"notmodified"---304 "、"parsererror"、"success"、"error")
定义方式例如:
?
1 2 3 4 5 6 7 8 9 10 $.ajax({ // ...
beforeSend:function (){
// Handle the beforeSend event },
complete:function (){
// Handle the complete event } // ... });
2) 全局事件,每次Ajax 请求都会触发,它会向DOM 中的所有元素广播,
你只需为DOM 中任意元素bind 好全局事件即会触发(若绑定多次,则会依次触发为事件注册的回调函数)。
ajaxSt art 开始新的Ajax 请求,并且此时jQuery 对象上没有其他ajax 请求正在进行。
签名:function(e)
函数说明:传入事件对象
ajaxSe nd 当一个Ajax 请求开始时触发 签名:function(e,jqXHR,s)
函数说明:传入事件对象、jqXHR 、s 对象
ajaxSu ccess 全局的请求成功
签名:function(e,jqXHR,s,data)
函数说明:传入事件对象、jqXHR 、s 对象、请求成功返回的相应数据
ajaxEr ror 全局的发生错误时触发 签名:function(e,jqXHR,s,errorData)
函数说明:传入事件对象、jqXHR 、s 对象、请求失败返回的错误信息
ajaxCo mplete 全局的请求完成时触发
签名:function(e,jqXHR,s)
函数说明:传入事件对象、jqXHR 、s 对象
ajaxSt op 当jQuery 对象上正在进行Ajax 请求都结束时触发。
签名:function(e)
函数说明:传入事件对象
全局事件在jQuery 中的声明方式:
?
1 2 3 4 5 jQuery.each("ajaxStart
ajaxStop
ajaxComplete
ajaxError
ajaxSuccess
ajaxSend".split(" " ),function ( i, o ){ jQuery.fn[ o ] =function ( f ){ return this .on( o, f ); }; });
所以我们可以使用下面两种方式定义全局事件:
?
1
2
3
4 // 可以用bind 来绑定,用unbind 来取消绑定。
$("#loading").bind("ajaxSend",function (){ … }); 或者: $("#loading").ajaxStart(function (){ … });
3) ajax 方法完整的事件流
4) 示例:$.ajax()触发的事件(局部事件和全局事件)
?
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1// 全局事件 $("#div_event").ajaxStart(function (e) {
doAddEvent4textarea('txt_event','触发ajaxStart 回调函数'); });
$("#div_event").ajaxSend(function (e) {
doAddEvent4textarea('txt_event','触发ajaxSend 回调函数'); });
$("#div_event").ajaxSuccess(function (e, jqXHR, s, data) { doAddEvent4textarea('txt_event','触发ajaxSuccess 回调函数'); });
$("#div_event").ajaxError(function (e, jqXHR, s, errorData) { doAddEvent4textarea('txt_event','触发ajaxError 回调函数'); });
$("#div_event").ajaxComplete(function (e, jqXHR, s) {
doAddEvent4textarea('txt_event','触发ajaxComplete 回调函数'); });
$("#div_event").ajaxStop(function (e) {
doAddEvent4textarea('txt_event','触发ajaxStop 回调函数'); }); // 局部事件
function bindLocalEvent(e) {
var textareaid = e.data.textareaid; var global = e.data.global;
$.ajax('AjaxHandler.ashx?func=btn_nowTime_long', {
type:'get', dataType:'text',
9 20 21 22
23 24 25
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
global: global, cache:false ,
beforeSend:function (jqXHR, s) {
doAddEvent4textarea(textareaid,'触发beforeSend 回调函数'); },
dataFilter:function (data, dataType) {
doAddEvent4textarea(textareaid,'触发dataFilter 回调函数'); },
success:function (data, statusText, jqXHR) {
doAddEvent4textarea(textareaid,'触发success 回调函数'); },
error:function (jqXHR, textStatus, errorThrown) { doAddEvent4textarea(textareaid,'触发error 回调函数'); },
complete:function (jqXHR, textStatus) {
doAddEvent4textarea(textareaid,'触发complete 回调函数'); } }); }
function doAddEvent4textarea(textareaid, txt) { var textarea = $("#" + textareaid);
textarea.val(textarea.val() +'\r\n' + txt); }
41 42 43 44 45 46 47 48 49 50 51
效果图:
5) $.ajax()方法的全局事件典型用例
你的页面存在多个甚至为数不少的ajax 请求,但是这些ajax 请求都有相同的消息机制。
ajax 请求开始前显示一个提示框,提示“正在读取数据”;ajax 请求成功时提示框显示“数据获取成功”;ajax 请求结束后隐藏提示框。
a) 不使用全局事件的做法是:
给$.ajax()加上beforeSend 、success 、complete 回调函数,在回调函数中加上处理提示框。
b) 使用全局事件的做法是:
?
1 2 $(document).ajaxStart(onStart)
.ajaxComplete(onComplete)
3 4 5 6 .ajaxSuccess(onSuccess);
function onStart(event) {//..... }
function onComplete(event, xhr, settings) {//..... }
function onSuccess(event, xhr, settings) {//..... }
3. jQuery ajax 相关函数
1) jQuery.ajaxSetup({ })
jQuery.ajax()函数中的所有的参数选项都可以通过
jQuery.ajaxSetup()函数来全局设置默认值。
2) $.ajax()函数的封装
a) $("").load(url [, params] [, callback])
请求远程的HTML 文件代码(dataType: "html "),默认使用 GET
方式,如果传递了params 参数则使用Post 方式。
在请求“成功”
完成时将responseText 属性值插入至DOM 中。
但不管请求是否成功
完成“在最后”都会执行callback 回调函数(即:
complete:callback)。
b) jQuery.get(url [, data] [, callback] [, type] )
通过HTTP GET 请求载入数据,并在请求成功时执行回调函数(即:
success: callback )。
c) jQuery.getJSON(url [, data] [, callback] )
通过 HTTP GET 请求载入 JSON 数据。
相当于: jQuery.get(url,
[data],[callback], "json")
可以通过使用JSONP 形式的回调函数来加载其他网域的JSON 数
据。
d) jQuery.getScript(url [, callback] )
通过 HTTP GET 请求载入并执行一个 JavaScript 文件。
相当于:
jQuery.get(url, null, [callback], "script")
可以跨域调用 JavaScript 文件。
e) jQuery.post(url [, data] [, callback] [, type] )
通过 HTTP POST 请求载入信息,并在请求成功时执行回调函数
(即:success: callback )。
3) 对象序列化
a) jQuery.param(object,traditional)
创建数组或对象的序列化表示,该序列化可在ajax 请求时在URL
查询字符串中使用。
序列化过程中会使用encodeURIComponent()函数把字符串作为URI 组件进行编码。
encodeURIComponent() 方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
其他字符(比如:;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
?
1
// 在param 中会进行如下处理
2 3
4 5 6 function ( key, value ) {
// 如果value 是函数,则取其函数返回值 value = jQuery.isFunction( value ) ? value() : value;
s[
s.length ] = encodeURIComponent( key ) +"=" + encodeURIComponent( value );
};
对于 jQuery 1.4,$.param() 方法将会通过深度递归的方式序
列化对象,以便符合现代化脚本语言的需求,比如 PHP 、Ruby on
Rails 等。
你可以传递traditional = true 或在ajax 功能中传递
包含traditional 的options 参数。
传送门:$.param()深度递归详解和$.param() 示例
b) $("").serializeArray()
可以将一个或多个表单元素(比如 input 、 textarea 等),或
者 form 元素本身的jQuery 对象序列化为JSON 对象。
(非 JSON 字
符串。
需要使用插件或者第三方库进行字符串化操作)
特别说明,元素不能被禁用(禁用的元素不会被包括在内),并
且元素应当有含有 name 属性。
提交按钮的值也不会被序列化。
文
件选择元素的数据也不会被序列化。
传送门:$("").serializeArray() 示例
c) $("").serialize()
可以将一个或多个表单元素(比如 input 、 textarea 等),或
者 form 元素本身的jQuery 对象序列化为经过URL 编码转换后的字
符串,可直接用在URL 查询字符串中。
jQuery 内部定义:
?
1 2 3 serialize:function () { return jQuery.param(this .serializeArray() ); }
传送门:$("").serialize()示例
$.ajax()中常见应用示例
1. cache 和ifModified 参数
1) cache 参数:GET 和POST 最重要的区别(传送门)
语义上,GET 是获取指定URL 上的资源,是读操作,重要的一点是
不论对某个资源GET 多少次,它的状态是不会改变的,在这个意义上,我们说GET 是安全的(不是被密码学或者数据保护意义上的安全)。
因为GET 是安全的,所以GET 返回的内容可以被浏览器,Cache 服务器缓存起来。
而POST 的语意是对指定资源“追加/添加”数据,所以是不安全的,
每次提交的POST ,参与的代码都会认为这个操作会修改操作对象资源的状态,于是,浏览器在你按下F5的时候会跳出确认框,缓存服务器不会
缓存POST 请求返回内容。
2) ifModified 参数:通过ifModified 参数提高请求性能(即:“条件
GET”:Last-Modified / If-Modified-Since 和ETag / If-None-Match )
当你请求的资源并不是一层不变的时候,即不能简单的一直使用客
户端缓存时,你可能通过将cache 设置为false 来发送请求,这实际上是在url 加上时间戳组合成新的url ,每次发送新的请求,这明显加大了服务器的压力。
对于这种情况,我们可以通过ifModified 参数改进缓存方式(即:
cache 和ifModified 都设置为true ),仅在请求的数据改变时重新获取。
通过这种方式请求的url 不会改变,并且每次都会发送到服务器,只是会有检验方法验证是否需要重新获取数据从而节省带宽和开销。
更多ETag 描述(优点,解决了Last-Modified 无法解决的一些问题,什么场合不应该被使用)
过程如下:
a) 将$.ajax()函数的cache 和ifModified 参数同时设置为true 。
b) 客户端请求服务端A ,在服务端加上Last-Modified/ETag 响应
体一起返回。
c) 客户端缓存接收到的Last-Modified/ETag 响应体,并在下一次
发生请求A 时将缓存的Last-Modified/ETag 值做为
If-Modified-Since/IF-None-Match 请求头一起发给服务器。
d) 服务器接收If-Modified-Since/IF-None-Match 后,就根据参
数值检验自上次客服端请求之后资源是否有改动
i. 若还未改动则直接返回响应304和一个空的响应体。
ii. 若已改动则重新处理数据,返回最新的请求数据。
e) 这样,既保证不向客户端重复发出资源,也保证当服务器有变
化时,客户端能够得到最新的资源。
这一过程中,我们只需要做:服务器返回Last-Modified/ETag 响应头和在服务端检验数据是否失效并采取对应处理方式。
其余步骤由jQuery 框架的ajax()函数完成。
关键代码如下:
客服端:
?
1 2 3 4 5 6 7 8 9 10 1$('#btn_nowTime_long3').bind('click',null
,function () {
$.ajax('AjaxHandler.ashx?func=GetServerTime4Modified',
{
type:'get',
dataType:'text',
cache:true ,
ifModified:true ,
success:function (data) {
if (data)
alert(data);
},。