jQuery初解析(第四波)

本文详细介绍了jQuery中的AJAX功能,包括不同返回类型(html, xml, json, js, jsonp)的工作原理及示例代码,同时讲解了如何利用jQuery提供的全局事件来控制AJAX请求流程。

5. jQuery中的ajax服务端返回方式

5.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(){

                     //请求出错处理

              }

});

52 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下支持

              }

});

53 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

});

              }

});

5.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’);

              }

});

5.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. jQuery中ajax全局事件的应用

大家看到这个题目的时候可能有点糊涂,ajax还有事件?答案是否定的。只是jQuery为了控制Ajax的流程,比如停止,监听当前的状态等等而自己定义的事件,这个事件说简单点就是自定义函数,在Ajax执行不同状态调用,作者形象的定义成事件和触发事件,实际就是函数和调用函数,jQuery共定义了ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend6个事件,下边就逐个介绍。

6.1 ajaxStart

在调用Ajax的时候首先就会触发该事件,Ajax计数器加1,不传递任何参数。

源码:jQuery.event.trigger( "ajaxStart" );

6.2 ajaxStop

Ajax执行到complete最后的时候触发该事件,Ajax计数器减1,不传递任何参数。

源码:jQuery.event.trigger( "ajaxStop" )

6.3 ajaxComplete

Ajax执行到complete后边触发ajaxStop之前时候触发该事件,传递数组对象,包含两个元素第一是当前的XMLHttpRequest对象,第二个是当前Ajax的属性对象,这个可以参考前边的ajax参数列表。

源码jQuery.event.trigger( "ajaxComplete", [xhr, s] );//xhr就是当前的XMLHttpRequest对象,s就是Ajax的属性对象

6.4 ajaxError

捕获到XMLHttpRequest异常的时候会触发该事件,传递数组对象,包含三个元素第一是当前的XMLHttpRequest对象,第二个是当前Ajax的属性对象,这个可以参考前边的ajax参数列表,第三个是错误代码。

源码:jQuery.event.trigger( "ajaxError", [xhr, s, e] );

6.5 ajaxSuccess

Ajax执行到success最后的时候触发该事件,传递数组对象,包含两个元素第一是当前的XMLHttpRequest对象,第二个是当前Ajax的属性对象,这个可以参考前边的ajax参数列表。

源码:jQuery.event.trigger( "ajaxSuccess", [xhr, s] );

6.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

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值