一.摘要
本篇文章讲解如何使用jQuery方便快捷的实现Ajax功能.统一所有开发人员使用Ajax的方式.
二.前言
Ajax让用户页面丰富起来, 增强了用户体验. 使用Ajax是所有Web开发的必修课. 虽然Ajax技术并不复杂, 但是实现方式还是会因为每个开发人员的而有所差异.jQuery提供了一系列Ajax函数来帮助我们统一这种差异, 并且让调用Ajax更加简单.
三.原始Ajax与jQuery中的Ajax
首先通过实例, 来看一下jQuery实现Ajax有多简单. 下面是一个使用原始Ajax的示例:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>jQuery Ajax</title> 5 <script type="text/javascript"> 6 $(function() 7 { 8 var xhr = new AjaxXmlHttpRequest(); 9 $("#btnAjaxOld").click(function(event) 10 { 11 var xhr = new AjaxXmlHttpRequest(); 12 xhr.onreadystatechange = function() 13 { 14 if (xhr.readyState == 4) 15 { 16 document.getElementById("divResult").innerHTML = xhr.responseText; 17 } 18 } 19 xhr.open("GET", "data/AjaxGetCityInfo.aspx?resultType=html", true); 20 xhr.send(null); 21 }); 22 }) 23 //跨浏览器获取XmlHttpRequest对象 24 function AjaxXmlHttpRequest() 25 { 26 var xmlHttp; 27 try 28 { 29 // Firefox, Opera 8.0+, Safari 30 xmlHttp = new XMLHttpRequest(); 31 } 32 catch (e) 33 { 34 // Internet Explorer 35 try 36 { 37 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 38 } 39 catch (e) 40 { 41 try 42 { 43 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 44 } 45 catch (e) 46 { 47 alert("您的浏览器不支持AJAX!"); 48 return false; 49 } 50 } 51 } 52 return xmlHttp; 53 } 54 </script> 55 </head> 56 <body> 57 <button id="btnAjaxOld">原始Ajax调用</button><br /> 58 <br /> 59 <div id="divResult"></div> 60 </body> 61 </html> 62
上面的实例中, data/AjaxGetCityInfo.aspx?resultType=html 地址会返回一段HTML代码.
使用原始Ajax, 我们需要做较多的事情, 比如创建XmlHttpRequest对象, 判断请求状态, 编写回调函数等.而用jQuery的Load方法, 只需要一句话:
1 $("#divResult").load("data/AjaxGetCityInfo.aspx", { "resultType": "html" });
现在只是用jQuery的Ajax函数, 我的页面变得简洁了:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>jQuery Ajax</title> 5 <script type="text/javascript" src="../scripts/jquery-1.3.2.min.js"></script> 6 <script type="text/javascript"> 7 $(function() 8 { 9 $("#btnAjaxJquery").click(function(event) 10 { 11 $("#divResult").load("data/AjaxGetCityInfo.aspx", { "resultType": "html" }); 12 }); 13 }) 14 </script> 15 </head> 16 <body> 17 <button id="btnAjaxJquery">使用jQuery的load方法</button> 18 <br /> 19 <div id="divResult"></div> 20 </body> 21 </html>
四.jQuery Ajax详解
jQuery提供了几个用于发送Ajax请求的函数. 其中最核心也是最复杂的是jQuery.ajax( options ),所有的其他Ajax函数都是它的一个简化调用. 当我们想要完全控制Ajax时可以使用此结果, 否则还是使用简化方法如get, post, load等更加方便. 所以jQuery.ajax( options ) 方法放到最后一个介绍. 先来介绍最简单的load方法:
1. load( url, [data], [callback] )
Returns: jQuery包装集
说明:
load方法能够载入远程 HTML 文件代码并插入至 DOM 中。默认使用 GET 方式, 如果传递了data参数则使用Post方式.
- 传递附加参数时自动转换为 POST 方式。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 "url #some > selector", 默认的选择器是"body>*".讲解:
load是最简单的Ajax函数, 但是使用具有局限性:
- (1)它主要用于直接返回HTML的Ajax接口
- (2)load是一个jQuery包装集方法,需要在jQuery包装集上调用,并且会将返回的HTML加载到对象中, 即使设置了回调函数也还是会加载.
- 不过不可否认load接口设计巧妙并且使用简单.下面通过示例来演示Load接口的使用:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>jQuery Ajax - Load</title> 5 <script type="text/javascript" src="../scripts/jquery-1.3.2-vsdoc2.js"></script> 6 <script type="text/javascript"> 7 $(function() 8 { 9 $("#btnAjaxGet").click(function(event) 10 { 11 //发送Get请求 12 $("#divResult").load("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click" + "×tamp=" + (new Date()).getTime()); 13 }); 14 $("#btnAjaxPost").click(function(event) 15 { 16 //发送Post请求 17 $("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxPost_click" }); 18 }); 19 $("#btnAjaxCallBack").click(function(event) 20 { 21 //发送Post请求, 返回后执行回调函数. 22 $("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxCallBack_click" }, function(responseText, textStatus, XMLHttpRequest) 23 { 24 responseText = " Add in the CallBack Function!
" + responseText25 $("#divResult").html(responseText); //或者: $(this).html(responseText); 26 }); 27 }); 28 $("#btnAjaxFiltHtml").click(function(event) 29 { 30 //发送Get请求, 从结果中过滤掉 "鞍山" 这一项 31 $("#divResult").load("../data/AjaxGetCityInfo.aspx?resultType=html" + "×tamp=" + (new Date()).getTime() + " ul>li:not(:contains('鞍山'))"); 32 }); 33 }) 34 </script> 35 </head> 36 <body> 37 <button id="btnAjaxGet">使用Load执行Get请求</button><br /> 38 <button id="btnAjaxPost">使用Load执行Post请求</button><br /> 39 <button id="btnAjaxCallBack">使用带有回调函数的Load方法</button><br /> 40 <button id="btnAjaxFiltHtml">使用selector过滤返回的HTML内容</button> 41 <br /> 42 <div id="divResult"></div> 43 </body> 44 </html> 上面的示例演示了如何使用Load方法.
提示:我们要时刻注意浏览器缓存, 当使用GET方式时要添加时间戳参数 (net Date()).getTime() 来保证每次发送的URL不同, 可以避免浏览器缓存.
提示: 当在url参数后面添加了一个空格, 比如" "的时候, 会出现"无法识别符号"的错误, 请求还是能正常发送. 但是无法加载HTML到DOM. 删除后问题解决.
2.jQuery.get( url, [data], [callback], [type] )
Returns: XMLHttpRequest
说明:
通过远程 HTTP GET 请求载入信息。
这是一个简单的 GET 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。讲解:
此函数发送Get请求, 参数可以直接在url中拼接, 比如:
1 $.get("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click"); 或者通过data参数传递:
$.get("../data/AjaxGetMethod.aspx", { "param": "btnAjaxGet2_click" });
两种方式效果相同, data参数会自动添加到请求的url中
如果url中的某个参数, 又通过data参数传递, 不会自动合并相同名称的参数.
回调函数的签名如下:
1 function (data, textStatus) { 2 // data could be xmlDoc, jsonObj, html, text, etc... 3 this; // the options for this ajax request 4 } 其中data是返回的数据, testStatus表示状态码, 可能是如下值:
"timeout","error","notmodified","success","parsererror"
在回调函数中的this是获取options对象的引用.有关options的各种说明, 请参见:
http://docs.jquery.com/Ajax/jQuery.ajax#optionstype参数是指data数据的类型, 可能是下面的值:
"xml", "html", "script", "json", "jsonp", "text".默认为"html".
jQuery.getJSON( url, [data], [callback] ) 方法就相当于 jQuery.get(url, [data],[callback], "json")
3. jQuery.getJSON( url, [data], [callback] )
Returns: XMLHttpRequest
相当于: jQuery.get(url, [data],[callback], "json")说明:
通过 HTTP GET 请求载入 JSON 数据。
在 jQuery 1.2 中,您可以通过使用JSONP 形式的回调函数来加载其他网域的JSON数据,如 "myurl?callback=?"。jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。注意:此行以后的代码将在这个回调函数执行前执行。
讲解:
getJSON函数仅仅将get函数的type参数设置为"JSON"而已. 在回调函数中获取的数据已经是按照JSON格式解析后的对象了:
1 $.getJSON("../data/AjaxGetCityInfo.aspx", { "resultType": "json" }, function(data, textStatus) 2 { 3 alert(data.length); 4 alert(data[0].CityName); 5 }); 服务器端返回的字符串如下:
1 [{""pkid"":""0997"",""ProvinceId"":""XJ"",""CityName"":""阿克苏"",""CityNameEn"":""Akesu"",""PostCode"":""843000"",""isHotCity"":false}, 2 {""pkid"":""0412"",""ProvinceId"":""LN"",""CityName"":""鞍山"",""CityNameEn"":""Anshan"",""PostCode"":""114000"",""isHotCity"":false} 3 ]
示例中我返回的就是一个数组, 使用data.length可以获取数组的元素个数, data[0]访问第一个元素, data[0].CityName访问第一个元素的CityName属性.
4.jQuery.getScript( url, [callback] )
Returns: XMLHttpRequest
相当于: jQuery.get(url, null, [callback], "script")
说明:
通过 HTTP GET 请求载入并执行一个 JavaScript 文件。
jQuery 1.2 版本之前,getScript 只能调用同域 JS 文件。 1.2中,您可以跨域调用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步执行脚本。如果通过 getScript 加入脚本,请加入延时函数。讲解:
以前使用dojo类库时官方默认的文件不支持跨域最后导致只能放弃使用dojo(虽然在网上找到了可以跨域的版本, 但是感觉不够完美). 所以特别对这个函数的核心实现和使用做了研究.首先了解此函数的jQuery内部实现, 仍然使用get函数, jQuery所有的Ajax函数包括get最后都是用的是jQuery.ajax(), getScript将传入值为"script"的type参数, 最后在Ajax函数中对type为script的请求做了如下处理:
1 var head = document.getElementsByTagName("head")[0]; 2 var script = document.createElement("script"); 3 script.src = s.url; 上面的代码动态建立了一个script语句块, 并且将其加入到head中:
1 head.appendChild(script); 当脚本加载完毕后, 再从head中删除:
1 // Handle Script loading 2 if(!jsonp) 3 { 4 var done = false; 5 //attach handlers for all browsers 6 script.onload = script.onreadystatechange = function() 7 { 8 if ( !done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete") ) 9 { 10 done = true; 11 success(); 12 complete(); 13 // Handle memory leak in IE 14 script.onload = script.onreadystatechange= null; 15 head.removeChild( script ); 16 } 17 }; 18 }
作者主要测试了此函数的跨域访问和多浏览器支持,下面是结果:
IE6 FireFox 注意事项 非跨域引用js 通过 通过 回调函数中的data和textStatus均可用 跨域引用js 通过 通过 回调函数中的data和textStatus均为undifinded
下面是作者关键的测试语句,也用来演示如何使用getScript函数:
1 $("#btnAjaxGetScript").click(function(event) 2 { 3 $.getScript("../scripts/getScript.js", function(data,textStatus) 4 { 5 alert(data); 6 alert(textStatus); 7 alert(this.url); 8 }); 9 }); 10 $("#btnAjaxGetScriptGross").click(function(event) 11 { 12 $.getScript("http://resource.elong.com/getScript.js", 13 function(data, textStatus) 14 { 15 alert(data); 16 alert(textStatus); 17 alert(this.url); 18 }); 19 });
5.jQuery.post(url,[data],[callback],[type])
Returns: XMLHttpRequest说明:
通过远程 HTTP POST 请求载入信息
这是一个简单的POST请求功能以取代复杂$.ajax,请求成功时可调用回调函数,如果需要在出错时执行函数,请使用 $.ajax。
讲解: 具体用法和get相同, 只是提交方式由“GET”改为“POST”6.jQuery.ajax( options )
Returns: XMLHttpRequest
说明:
通过 HTTP 请求加载远程数据。
jQuery底层AJAX实现,简单易用的高层实现见$.get,$.post等$.ajax() 返回其创建的 XMLHttpRequest对象。大多数情况下你无需直接操作该对象,但特殊情况下可用于手动终止请求。
$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息。详细参数选项见下。
注意: 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml),错误的MIME类型可能导致不可预知的错误。Specifying the Data Te for AJAX Requests
注意:如果dataType 设置为“script”,那么所有的远程(不再同一域名下)的POST请求都将转化为GET请求,因为将使用DOM的script标签来加载
jQuery 1.2 中,您可以跨域加载 JSON 数据,使用时需将数据类型设置为JSONP,使用JSONP形式调用函数时,如"myurl?callback=?" jQuery将自动替换?为正确的函数名,以执行回调函数。数据类型设置为"jsonp"时,jQuery 将自动调用回调函数。