您的位置:首页 > Web前端 > JQuery

jQuery与Ajax的应用(2)

2009-05-14 07:31 337 查看
6.3.5 $.ajax(options)的用法
这个是jQuery 的底层 Ajax 实现。简单易用的高层实现见 $.get, $.post 等。 $.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该对象,但特殊情况下可用于手动终止请求。
注意: 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml")。错误的 MIME 类型可能导致不可预知的错误。见 Specifying the Data Type for AJAX Requests 。当设置 datatype 类型为 'script' 的时候,所有的远程(不在同一个域中)POST请求都回转换为GET方式。
$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息。详细参数选项见下。 jQuery 1.2 中,您可以跨域加载 JSON 数据,使用时需将数据类型设置为 JSONP。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。数据类型设置为 "jsonp" 时,jQuery 将自动调用回调函数。

参数名称
类型
说明
url
String
(默认: 当前页地址) 发送请求的地址
type
String
(默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
timeout
Number
(默认:0)设置请求超时时间(毫秒)。此设置将覆盖全局设置
data
Object
发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。
contentType
String
(默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数应用场合
processData
Boolean
(默认: true) 默认情况下,发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
username
String
如果服务器需要登录访问的时候的用户名,一般不需要
password
String
如果服务器需要登录访问的时候的密码,一般不需要
accepts
Object
{xml: "application/xml, text/xml",
html: "text/html",
script: "text/javascript, application/javascript",
json: "application/json, text/javascript",
text: "text/plain",
_default: "*/*"}告诉服务器可接受的数据类型,和下边的dataType是对应的,不需要修改
dataType
String
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,可用值:
"xml": 返回 XML 文档,可用 jQuery 处理。
"html": 返回纯文本 HTML 信息;包含 script 元素。
"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。
"json": 返回 JSON 数据 。
"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
beforeSend
Function
发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数
error
Function
(默认: 自动判断 (xml 或 html)) 请求失败时将调用此方法。这个方法有三个参数:XMLHttpRequest 对象,错误信息,(可能)捕获的错误对象
complete
Function
请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象,成功信息字符串。
sucess
Function
请求成功后回调函数。这个方法有两个参数:服务器返回数据,返回状态

global
Boolean
(默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件
ifModified
Boolean
(默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断
cache
Boolean
(默认: true) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息
async
Boolean
(默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行
示例代码:
$.ajax({
type: "get",
url: "http://www.xxx.com/test.html",
beforeSend: function(XMLHttpRequest){
//ShowLoading();
},
success: function(data, textStatus){
//do something
},
complete: function(XMLHttpRequest, textStatus){
//HideLoading();
},
error: function(){
//请求出错处理
}
});
6.4 jQuery中的ajax服务端返回方式
6.4.1 html方式
这种方式是最常见的方式(默认方式),如果是IE7下执行和FireFox的对象是一样的,XMLHttpRequest,上边我们讲了有onreadystatechanage事件,readyState属性,当是html形式返回的时候,用到了另外一个属性responseText,当readyState=4的时候,XMLHttpRequest对象自动将放回的值以字符串的形式赋值给该属性(这个不是jQuery的功能,是XMLHttpRequest),jQuery返回该字符串(这里如果返回值中有JS代码,并不执行),执行sucuess回调函数,比如html()、append()等等,这些函数讲html代码装载到当前页面的时候才执行其中包含的js代码,而且该代码只执行一次并不缓存。详细的说明请看文件操作函数说明。
示例代码:
$.ajax({
type: "get",
url: "http://www.xxx.com/test.html",
dataType: "html",//(可以不写,默认)
beforeSend: function(XMLHttpRequest){
//ShowLoading();
},
success: function(data, textStatus){
alert(data);//data是一个字符串对象
},
complete: function(XMLHttpRequest, textStatus){
//HideLoading();
},
error: function(){
//请求出错处理
}
});
6.4.2 xml方式
xml方式和html方式的整个工作流程是一样,就是操作了不同的属性,返回不同的对象,html方式操作的responseText属性,而xml方式操作的是responseXML属性,html返回是一个String对象,而xml返回的是一个XML对象。操作返回值的时候就大不相同,必须按照XML对象的方式进行操作,如果用alert(),结果肯定是object,相关的操作可以看看xml document 对象属性手册(附件)。xml和html不一样,定义很严格,没有容错机制,如果被请求的xml写的不正确,或者是不完整,jQuery抛出一个异常,Ajax请求终止。
示例代码:
$.ajax({
url:'my.xml',
type: 'GET',
dataType: 'xml',
timeout: 3000,
error: function(xml){
alert('Error loading XML document'+xml);
},
success: function(x){
alert(x.xml);//xml的xml属性只在IE下支持
}
});
6.4.3 json方式
json方式和html方式在请求和服务器中完全是一样,就不在重复说明,请求的返回值实际上都是String对象,有两点不同,第一:html方式的时候并没有限制返回的字符串格式,而json方式的时候,必须符合json协议的规范。第二:html方式请求完成之后没有做任何的操作直接回调sucuess,而json多了一步就是加了eval,执行返回的字符串,看看源码data = eval("(" + data + ")");返回json对象。
示例代码:
$.ajax({
url:'my.js',//{‘name’:’name’,’test’:’test’}
type: 'GET',
dataType: json,
timeout: 3000,
error: function(xml){
alert('Error loading XML document'+xml);
},
success: function(data){
$.each(data,function(i,n){
alert(n);//显示name和test
});
}
});
6.4.4 js方式
js方式和jsonp方式应该严格意义上不属于Ajax范畴,属于浏览器对含有src属性标签的二次请求原理。当然这里只用了script标签,工作原理就是在head中创建一个script标签,src属性就是url,浏览器自动加载js文件,并执行(不缓存,只执行一次)。由于他不是真正意义上的Ajax,所以jQuery定义的全局Ajax事件并不能完全触发,只能触发两个事件ajaxSuccess和ajaxComplete。
示例代码:
$.ajax({
url:'my.js',//alert(‘test’)
type: 'GET',
dataType: script,
timeout: 3000,
success: function(data){
alert(‘load js success’);
}
});
6.4.5 jsonp方式
jsonp方式的交互方式和js是一样的,本身xmlHttpRequest对象并不能跨域访问,但是script标签的src可以跨域访问,这里就注意两个概念:第一Ajax是不能跨域操作的,第二jQuery的jsonp是可以跨域操作,jsonp到底是什么东西呢?他是一个非官方的定义,目前的规范,需要服务器和客户端进行配合使用,服务器返回必须是这样的格式:
xxx(json对象);xxx是客户端定义的函数名字.
客户端需要这样的定义格式url?callback=xxx,这个的callback和xxx都是自己定义,只要服务器端能理解即可。如果没有定义xxx函数默认是?,jQuery会自动将?替换成内部定义的函数jquery12345678990这样的形式。
为什么需要这样定义呢?因为js本身不能操作script标签src请求结果中的数据(如果想操作就需要用DOM获得innerText再加上eval)。就定义一个客户端函数,将请求的结果以参数的形式传递进去,就可以操作了。
示例代码:
jsonp.php
<?php
echo $_GET[‘callback’].“({‘name’,’name’});”;
jsonp.aspx
Response.Write(Request["callback "] + "({'name': 'name'});");
jquery代码
$.ajax({
url:' jsonp.php?callback=test',//alert(‘test’)
type: 'GET',
dataType: jsonp,
timeout: 3000,
success: function(data){
alert(‘load jsonp success’);
}
});
function test(data){
alert(data);
}
6.5 jQuery中ajax全局事件的应用
大家看到这个题目的时候可能有点糊涂,ajax还有事件?答案是否定的。只是jQuery为了控制Ajax的流程,比如停止,监听当前的状态等等而自己定义的事件,这个事件说简单点就是自定义函数,在Ajax执行不同状态调用,作者形象的定义成事件和触发事件,实际就是函数和调用函数,jQuery共定义了ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend6个事件,下边就逐个介绍。
6.5.1 ajaxStart
在调用Ajax的时候首先就会触发该事件,Ajax计数器加1,不传递任何参数。
源码:jQuery.event.trigger( "ajaxStart" );
6.5.2 ajaxStop
Ajax执行到complete最后的时候触发该事件,Ajax计数器减1,不传递任何参数。
源码:jQuery.event.trigger( "ajaxStop" )
6.5.3 ajaxComplete
Ajax执行到complete后边触发ajaxStop之前时候触发该事件,传递数组对象,包含两个元素第一是当前的XMLHttpRequest对象,第二个是当前Ajax的属性对象,这个可以参考前边的ajax参数列表。
源码jQuery.event.trigger( "ajaxComplete", [xhr, s] );//xhr就是当前的XMLHttpRequest对象,s就是Ajax的属性对象
6.5.4 ajaxError
捕获到XMLHttpRequest异常的时候会触发该事件,传递数组对象,包含三个元素第一是当前的XMLHttpRequest对象,第二个是当前Ajax的属性对象,这个可以参考前边的ajax参数列表,第三个是错误代码。
源码:jQuery.event.trigger( "ajaxError", [xhr, s, e] );
6.5.5 ajaxSuccess
Ajax执行到success最后的时候触发该事件,传递数组对象,包含两个元素第一是当前的XMLHttpRequest对象,第二个是当前Ajax的属性对象,这个可以参考前边的ajax参数列表。
源码:jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
6.5.6 ajaxSend
执行beforeSend之后,XMLHttpRequest调用send之前,触发该事件,传递数组对象,包含两个元素第一是当前的XMLHttpRequest对象,第二个是当前Ajax的属性对象,这个可以参考前边的ajax参数列表。
源码:jQuery.event.trigger("ajaxSend", [xhr, s]);
最后我们举个简单的例子,就应该明白如果使用这些事件控制整个Ajax流程了,比如一个页面上有三给Ajax请求(都是异步请求),但是需求是不能锁住浏览器还要Ajax顺序执行,意思就是第一个Ajax执行完成之后才执行第二个,再执行第三个,如果有一个异常,其他的Ajax也不需要请求,这样的情况的时候这些事件就派上用场了。
示例代码:
var AjaxStack=[];//Ajax等待执行队列(先进先出)
$(document).ajaxSuccess(function(o,s){
AjaxStack.shift();
});
$(document).ajaxComplete(function(){
var tmp=AjaxStack.shift();
if(tmp){
$(tmp[0]).loading(tmp[1],tmp[2],tmp[3]);
}
});
$.fn.loading function(u, opt, f){
AjaxStack.push([this,u,opt,f]);
if($.active){
return;
}
$.ajax({
data: opt,
type: "get",
url: u,
beforeSend: function(XMLHttpRequest){
//加一些效果测试是不是顺序执行的
},
success: function(data, textStatus){
//sucuss
},
complete: function(XMLHttpRequest, textStatus){
//complete
}
});
}
$(‘#test1’).loading(‘test1.html’);
$(‘#test2’).loading(‘test2.html’);
$(‘#test3’).loading(‘test3.html’);
注意,在Ajax全部事件申明的时候,也是jQuery对象,但是该对象不起任何作用,只是为了能访问到,所以说$(document).ajaxComplete(function(){})和$(‘#test1’).ajaxComplete(function(){})是等价的。为了命名规范你可以定义成和Ajax调用的对象是一致,但是没有任何实际意义,从触发的源码中应该看出,他用的是全局对象jQuery。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: