[关闭]
@tsingwong 2016-03-10T08:25:14.000000Z 字数 7144 阅读 824

锋利的jQuery Day6

JavaScript jQuery


jQuery与Ajax的应用

1 Ajax的优势和不足

1.1 Ajax的优势

  1. 不需要插件支持:可以被绝代多数主流浏览器所支持
  2. 优秀的用户体验:能在不刷新整个页面的前提下更新数据
  3. 提高Web程序的性能:传统模式中,数据提交通过表单(Form)来实现,数据获取是靠全面舒心来获取的;而Ajax模式只通过XMLH对象向服务器端提交希望提交的数据,即按需发送
  4. 减轻服务器和带宽的负担:工作原理想到于在用户和服务器之间加了一个中间层,使用户操作与服务器响应异步化。

1.2 Ajax的不足

2 Ajax的XMLHttpRequest对象

Ajax的核心是XMLHttpRequest对象,它是Ajax实现——发送异步请求、接受相应及执行回调的关键。
下面是对于不同浏览器创建XMLHttpRequest对象的不同方法:

  1. if (window.XMLHttpRequest)
  2. {// code for IE7, Firefox, Opera, etc.
  3. xmlhttp=new XMLHttpRequest();
  4. }
  5. else if (window.ActiveXObject)
  6. {// code for IE6, IE5
  7. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  8. }

5 jQuery中的Ajax

jQuery对Ajax操作进行了封装,在jQuery中$.ajax()方法属于最底层方法,第二层是$.load()、$.get()和$.post()方法,第三层是$.getScript()和$.getJSON()方法。

5.1 load()方法

  1. load(url[,data][,callback]);
参数名称 类 型 说 明
url String 请求HTML页面的URL地址
data(可选) Object 发送到服务器的key/value数据
callback(可选) Function 请求完成时的回调函数,无论请求成功或失败

如果只想加载指定url内的部分元素,可以使用load()方法的URL参数来达到目的。URL参数的语法结构是:“url selector”。注意,URL和选择器之间有一个空格。

load()方法的传递方式根据参数data来自动指定。如果没有参数传递,采用GET方式传递;反之,自动转换成POST方式。

对于必须在加载完成后才能继续的操作,load()方法提供了回调函数(callback),该函数有3个参数,分别代表请求返回的内容,请求状态和XMLHttpRequest对象:

  1. $("#resText").load("test.html",function(responseText,textStatus,XMLHttpRequest){
  2. // responseText: 请求返回的内容
  3. //textStatus: 请求状态:success、error、notmodified、timeout 4种
  4. // XMLHttpRequest: XMLHttpRequest对象

注:在load()方法中,无论Ajax请求是否成功,只要当请求完成后,回调函数就会被触发。

5.2 $.get()方法和$.post()方法

load()方法通常用来从Web服务器上获取静态的数据文件。在项目中,如果需要传递一些参数给服务器中的页面,那么可以使用$.get()和$.post()(或$.ajax()方法)。

5.2.1 $.get()方法

$.get()方法使用GET方法来进行异步请求,语法结构为:

  1. $.get(url [,data] [,callback] [,type]);
参数名称 类 型 说 明
url String 请求的HTML页的URL地址
data(可选) Object 发送到服务器的key/value数据会作为QueryString附加到请求的URL中
callback(请求) Function 载入成功时回调函数(只有当Response的返回状态时success才调用该方法)自动将请求结果和状态传递给该方法
type(可选) String 服务器端返回内容的格式,包括xml、html、script、json、text和_default

$.get()方法的回调函数只有两个参数:

  1. function(){
  2. //data; 返回内容,可以是xml文档,JSON文件,HTML片段
  3. //textStatus; 请求状态:success.error,notmodified,timeout 4种

data参数代表请求返回的内容,textStatus参数代表请求状态,而回调函数只有当数据成功返回(success)后才被执行,这与load()方法不同。

  1. $(function(){
  2. $("#send").click(function(){
  3. $.get("get1.php",{
  4. username:$("#username").val(),
  5. content:$("#content").val()
  6. },function(data,textStatus){
  7. $("#resText").html(data);
  8. });
  9. });
  10. })

由于服务器端返回的数据格式是HTML片段,因此并不需要经过处理就可以将新的HTML数据插入到主页面。HTML片段实现起来只需要很少工作量,但这种固定的数据结构不一定能够在其他的Web应用中得到重用。

  1. $(function() {
  2. $("#send").click(function() {
  3. $.get("get2.php", {
  4. username: $("#username").val(),
  5. content: $("#content").val()
  6. }, function(data, textStatus) {
  7. var username = $(data).find("comment").attr("username");
  8. var content = $(data).find("comment content").text();
  9. var txtHtml = "<div class='comment'><h6>" + username + ":</h6><p class='para'>" + content + "</p></div>";
  10. $("#resText").html(txtHtml);
  11. });
  12. });
  13. })

由于服务器端返回的数据是XML文档,所以需要对返回的数据进行处理。XML文档的可移植性是其他数据格式无法比拟,因此这种格式提供的数据的重要性极大提高。但XML文档体积相对较大,与其他文件格式相比,解析和操作速度要慢一些。

JSON文件和XML文档一样,可以方便被重用。且JSON文件相当简洁,也容易阅读。

  1. $(function() {
  2. $("#send").click(function() {
  3. $.get("get3.php", {
  4. username: $("#username").val(),
  5. content: $("#content").val()
  6. }, function(data, textStatus) {
  7. var username = data.username;
  8. var content = data.content;
  9. var txthtml = "<div class='comment'><h6>"+username+"</h6><p class='para'>"+content+'</p></div>';
  10. $("#resText").html(txthtml);
  11. },"json");
  12. });
  13. });

$.get()方法的第4个参数(type)设置为“json”表示期待服务器端返回的数据格式。
得知在不需要与其他应用程序共享数据的时候,使用HTML片段来提供返回数据一般是最简单的;如果数据需要重用,那么JSON文件是不错的选择;当远程应用程序未知时,XML文档是最佳选择, 它是Web服务领域的世界语。

5.2.2 $.post()方法

$.get()方法结构和使用方式都相同,其区别如下:

  1. GET请求将参数跟在URL后进行传递,POST请求则是作为HTTP消息的实体内容发送给Web服务器。在Ajax请求中,这种却别对用户是不可见的。
  2. GET方式对传输的数据有大小限制(通常不能大于2KB),而使用POST方式传递的数据理论上不受限制。
  3. GET方式请求的数据会被浏览器缓存起来,故可以从浏览器历史中读取到这些数据,如账号密码等。POST相对可以避免这些问题。
  4. GET方式和POST传递的数据在服务器端的获取也是不同的。在PHP中,GET方式的数据可以用$_GET[ ]获取,而POST方式可以用$_POST[ ]获取。两种方式都可以用$_REQUEST[ ]来获取。

$.ajax()不仅能实现与load()、$.get()和$.post()方法有同样的功能,而且还能设定beforeSend(请求成功后处理)、error(请求失败后处理)、success(请求成功后处理)以及complete(提交前回调函数)。另外还有一些参数,可以设置Ajax请求的超时时间或者页面的“最后更改”状态等。

5.3 $.getScript()方法和$.getJson()方法

5.3.1 $.getScript()

在页面初次加载时就取得所需的全部JavaScript文件是完全没有必要的。可以根据需要哪个JavaScript文件,而动态的创建<script>标签:

  1. $(document.createElement("script")).attr("src","test.js").appendTo("head");

或者:

  1. $("<srcipt type="text/javascript" src="test.js">).appendTo("head");

但这种方式并不理想。可以使用$.getScript()方法来直接加载.js文件,与加载一个HTML片段一样简单方便,并不需要对JavaScript文件进行处理,JavaScript文件会自动执行:

  1. $(function(){
  2. $('#send').click(function(){
  3. $.getScript('test.js',function(){
  4. //回调函数
  5. });
  6. });
  7. })

$.getScript()方法也有回调函数,会在JavaScript文件成功载入后运行。

5.3.2 $.getJSON()

$.getJSON()方法用于加载JSON文件,与$.getScript()方法用法相同:

  1. $(function(){
  2. $('#send').click(function(){
  3. $.getJSON('test.json',function(data){
  4. //data:返回的数据
  5. });
  6. });
  7. })

$.each()函数不同于each()方法,它是个全局函数,不操作jQuery对象,而是一个数组或者对象作为第一个参数,以一个回调函数作为第二个参数。回调函数有两个参数:第1个为对象的成员或数组的索引,第2个为对应变量或内容:

  1. $.each( data , function(commentIndex, comment) {
  2. html += '<div class="comment"><h6>' + comment['username'] + ':</h6><p class="para">' + comment['content'] + '</p></div>';
  3. })

还可以通过使用JSONP形式的回调函数来加载其他网站的JSON数据。

5.4 $.ajax()方法

$.ajax()方法是jQuery最底层的Ajax实现。语法结构:

  1. $.ajax(options);

只有1个参数,但是这个对象包含了$.ajax()方法所需要的请求设置一集回调函数等信息,参数以key/value形式存在,所有参数都是可选的:

参数名称 类 型 说 明
url String (默认为当前页地址)发送请求的地址
type String 请求方式(POST或GET)默认为GET。注意其他HTTP请求方法,例如PUT和DELECT也可以使用,但仅部分浏览器支持
timeout Number 设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置
data Object
   或
String
发送到服务器的数据。自动转换为字符串格式。GET请求中将附加在URL后。
dataType String 预期服务器返回的数据类型。默认将自动根据HTTP包MIME信息返回responseXML或responseText,并作为回调函数参数传递。
beforeSend Function 发送请求前可以修改XMLHttpRequest对象的函数,XMLHttpRequest对象是唯一参数
complete Function 请求完成后调用的回调函数(请求成功或失败时均调用),参数为XMLHttpRequest对象和一个描述成功请求类型的字符串
success Function 请求成功后调用的回调函数,两个参数:服务器返回的根据dataType参数进行处理后的数据;描述状态的字符串
error Function 请求失败时被调用的函数,三个参数:XMLHttpRequest对象、错误信息、捕获的错误对象(可选)
global Boolean 默认为true。表示是否触发全局Ajax事件。设置false将不会出发全局Ajax事件。
  1. $(function(){
  2. $('#send').click(function() {
  3. $.ajax({
  4. type: "GET",
  5. url: "test.js",
  6. dataType: "script"
  7. });
  8. });
  9. })

上述代码代替$.getScript()方法。

  1. $(function(){
  2. $('#send').click(function() {
  3. $.ajax({
  4. type: "GET",
  5. url: "test.json",
  6. dataType: "json",
  7. success : function(data){
  8. $('#resText').empty();
  9. var html = '';
  10. $.each( data , function(commentIndex, comment) {
  11. html += '<div class="comment"><h6>' + comment['username'] + ':</h6><p class="para">' + comment['content'] + '</p></div>';
  12. })
  13. $('#resText').html(html);
  14. }
  15. });
  16. });
  17. })

上述代码代替$.getJSON()方法。

6 序列化元素

6.1 serialize()方法

提交表单常规做法是,使表单提交到另一个页面,整个浏览器都会被刷新。而Ajax技术能够达到异步地提交表单,并将服务器返回的数据显示在当前页面中。
少量字段的表单可以使用:

  1. $(function(){
  2. $('#send').click(function(){
  3. $.get("get1.php",{
  4. username:$("#username").val(),
  5. content:$("#content").val()
  6. },function(data,textStatus){
  7. $("#resText").html(data);
  8. })
  9. })
  10. })

jQuery提供了一个简化方法——serialize(),作用对象是jQuery对象,能将DOM元素内容序列化为字符串,用于Ajax请求。

  1. $(function(){
  2. $('#send').click(function(){
  3. $.get("get1.php",$('#form1').serialize(),function(data,textStatuse){
  4. $("#resText").html(data);
  5. })
  6. })
  7. })

注serialize()方法不只表单可以使用,其他选择器选取的元素也可以使用。

6.2 seruakuzeArray()方法

serializeArray()方法是将DOM元素序列化,返回JSON格式的数据:

  1. var fields = $(":checkbox,:radio").serializeArray();
  2. console.log(fields);

6.3 $.param()方法

$.param()方法是serialize()方法的核心,用来对一个数组或对象按照key/value进行序列化:

  1. var obj = {a:1,b:2,c:3};
  2. var k = $.param(obj);
  3. alert(k);//输出a=1&b=2&c=3
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注