`

jquery.ajax源代码初探

    博客分类:
  • java
阅读更多

前言: 我是根据ajax:function()那个源代码的代码顺序写的,摘要了一部分经典写法和思路的笔记与分析,如果有不足之处欢迎指教,源代码我贴在分析下面,最好还是看jquery的源文件.


一句一句开始分析作者代码,句句精辟啊,够我们研究好长时间了:

1。 var jsonp, jsre = /=\?(&|$)/g, status, data;

      首先遇到的是一句正则表达式定义语句,具体我们分析这个正则表达式/=\?(&|$)/g,这个正则表达式第一个要注意的地方就是g,

这个标志标明是全局匹配,换言之就是找到所有的匹配,而不是在找到第一个之后就停止匹配。而/=\?(&|$)/是匹配=?&或者=?结尾的这个玩意滴。

      这个正则表达式只能说日他大爷了,写的太精妙了,至少是我第一次见过,他可以拆分成/=\?&/和/=\?$/,前面那个(/=\?& /)匹配是有=?&的,因为没有边界符,所以只要匹配的字符串有就成功,而第二个(/=\?$/)是匹配以=?结尾的,因为它用了$边界符,这个 东西只有自己测试过了才弄明白,真是日大爷滴。

      题外话这里我严重怀疑|这个或操作也使用左匹配策略的。

2. s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));

调用了一段jquery的另一个方法,暂时先不管这个方法是做什么用的,反正从注释看差不多就是一个check过程。继续往下

3。 if ( s.data && s.processData && typeof s.data != "string" )

s.data = jQuery.param(s.data);

看到这个执行语句,我们就该猜到了传进来的s不是一个简单的字符串,而是一个对象,这个对象有这个data属性,OK,我们参照jquery文档挖掘这个s对象:

s对象的属性有:

options (可选):AJAX请求设置。所有选项都是可选的

async (Boolean):(默认:true)默认设置下,所有请求均为异步请求,如果需要发送同步请求,请将此选项设置为false.注意,同步请 求将锁住浏览器

,用户其它操作等待请求完成才可以执行。

beforeSend (Function):发送请求前可修改XMLHttpRequest对象的函数,如添加自定义HTTP头。XMLHttpRequest对象是唯一 的参数。Ajax函数

cache(boolean): (默认: true,dataType为script时默认为false) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载 请求信息。

complete (Function) : 请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象和一个描述成功请求类型 的字符串。 Ajax 事件。 

contentType (String) : (默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多 数应用场合。

data (Object,String) : 发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。

dataFilter (Function) :给Ajax返回的原始数据的进行预处理的函数。提供data和type两个参数:data是Ajax返回的原始数据, type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。 

dataType (String) : 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或

responseText ,并作为回调函数参数传递,可用值: 

"xml": 返回 XML 文档,可用 jQuery 处理。

"html": 返回纯文本 HTML 信息;包含 script 元素。 

"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了"cache"参数

"json": 返回 JSON 数据 。

"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以 执行回调函数。

"text": 返回纯文本字符串

error (Function) : (默认: 自动判断 (xml 或 html)) 请求失败时调用时间。参数:XMLHttpRequest 对象、错误信息、(可选) 捕获的错误对象。Ajax 事件。 

global (Boolean) : (默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或ajaxStop 可用于控制不同的 Ajax 事件。

ifModified (Boolean) : (默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。

jsonp (String) : 在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里 的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。

password (String) : 用于响应HTTP访问认证请求的密码

processData (Boolean) : (默认: true) 默认情况下,发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型

"application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。

scriptCharset (String) : 只有当请求时dataType为"jsonp"或"script",并且type是"GET"才会用于强制修改charset。通常在本 地和远程的内容编码不同时使用。

success (Function) : 请求成功后回调函数。参数:服务器返回数据,数据格式。 Ajax 事件。 

timeout (Number) : 设置请求超时时间(毫秒)。此设置将覆盖全局设置。

 

type (String) : (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。

 

url (String) : (默认: 当前页地址) 发送请求的地址。

 

username (String) : 用于响应HTTP访问认证请求的用户名

由于从实际的运用来看,传递s的时候都是直接对象生成的方式做的,所以我不知道jquery是否有地方定义了这些属性,不过文档时这么定义的,姑且先相信吧。

所以这段程序判断是是发送到服务器的内容不为空且数据又不是普通字符串的前提下并且同时processData为true(processData的含义见文档),那么就对参数进行jquery.param()处理,其实也就是Json处理拉。

4。 if ( s.dataType == "jsonp" ) {

if ( s.type.toLowerCase() == "get" ) {

if ( !s.url.match(jsre) )

s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";

} else if ( !s.data || !s.data.match(jsre) )

s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";

s.dataType = "json";

   }

说句抱怨的话,这里看的我好累,因为dataType设置为jsonp我也没用过,既然看着代码好像写的挺高深滴,那么就来仔细愁愁:

if ( !s.url.match(jsre) )

s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";

} else if ( !s.data || !s.data.match(jsre) )

s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";

jsre这个正则表达式在第一个分析就已经分析透彻了,是匹配url地址后面的=?&或者=?结尾。那么我们看匹配成功和匹配失败两种状态分别做了什么:

Get参数时:

匹配失败:手动替URL的末尾加上callback=?(当s.jsonp没设置的时候)或者s.jsonp值=?这种格式。(注意这个语句,很精妙,够研究一段时间咯)。

匹配成功:维持不动

POST参数时:

匹配失败或者s.data为空:为s.data设置callback=?(当s.jsonp没设置的时候)或者s.jsonp值=?这种格式。(注意这个语句,很精妙,够研究一段时间咯)。

匹配成功是:不处理

最后都会把s.dataType设置成"json".

5。 // Build temporary JSONP function

if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {

jsonp = "jsonp" + jsc++;

// Replace the =? sequence both in the query string and the data

if ( s.data )

s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");

s.url = s.url.replace(jsre, "=" + jsonp + "$1");

// We need to make sure

// that a JSONP style response is executed properly

s.dataType = "script";

// Handle JSONP-style loading

window[ jsonp ] = function(tmp){

data = tmp;

success();

complete();

// Garbage collect

window[ jsonp ] = undefined;

try{ delete window[ jsonp ]; } catch(e){}

if ( head )

head.removeChild( script );

};

}

注释标明这是一个建立临时jsonp方法的过程,主要方法是在:

window[ jsonp ] = function(tmp){

data = tmp;

success();

complete();

// Garbage collect

window[ jsonp ] = undefined;

try{ delete window[ jsonp ]; } catch(e){}

if ( head )

head.removeChild( script );

};

为window这个最顶级的对象创建了一个属性,属性名就叫jsonp = "jsonp" + jsc++;  这个方法只有一次有效,调用完后它会自己删除自己,类似java的垃圾

回收,释放空间。

这个方法什么时候被执行?(这个我还真不知道,还要继续分析或者再度深度理解debug代码去了)

这个方法执行后,s.dataType都被设置成了"script".

6. if ( s.dataType == "script" && s.cache == null )

s.cache = false;

综上所述,jsonp,script都不能使用缓存.

题外话,事实上,jsonp这种类型是可以删除的,因为到这里为止,我们发现如果我们在URL中或者提交数据中有callback=?这种参数,类型是json,那么就是jsonp了。

7。 if ( s.cache === false && s.type.toLowerCase() == "get" ) {

var ts = (new Date()).getTime();

// try replacing _= if it is there

var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");

// if nothing was replaced, add timestamp to the end

s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");

}

// If data is available, append data to url for get requests

if ( s.data && s.type.toLowerCase() == "get" ) {

s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;

// IE likes to send both get and post data, prevent this

s.data = null;

}

看代码注释就明白意思了,值得关注的这里大量使用了分词技术(或者叫分组技术)。正则表达式的一种据说是高端使用方式,牛X的。

8. // Watch for a new set of requests

if ( s.global && ! jQuery.active++ )

jQuery.event.trigger( "ajaxStart" );

增加事件监听?莫非要做垃圾回收?

9. // If we're requesting a remote document

// and trying to load JSON or Script with a GET

if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && ( s.dataType == "script" || s.dataType =="json" ) && s.type.toLowerCase() == "get" ) {

var head = document.getElementsByTagName("head")[0];

var script = document.createElement("script");

script.src = s.url;

if (s.scriptCharset)

script.charset = s.scriptCharset;

// Handle Script loading

if ( !jsonp ) {

var done = false;

// Attach handlers for all browsers

script.onload = script.onreadystatechange = function(){

if ( !done && (!this.readyState || 

this.readyState == "loaded" || this.readyState == "complete") ) {

done = true;

success();

complete();

head.removeChild( script );

}

};

}

head.appendChild(script);

// We handle everything using the script element injection

return undefined;

}

第一个使用到的主AJAX方法,是调用js的ajax,获取头部对象,创建一个script对象,然后引用js的路径,最后加载JS完成后执行对应方法.

OK.这里有两个疑问了:

1。如果jsonp不为空,如何处理

2。先处理一步请求,然后再加载script,当然这个过程是不能乱的,但是这个过程下,明显被加载的那个js还不能操作页面内容?这个要测试

  过才知道。

10。 var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();

非常经典的一个获取XMLHttpRequest的语句,兼容各品牌和版本的浏览器。

11。 xml.open(s.type, s.url, s.async, s.username, s.password);

这里来补充下XMLHttpRequest的基本知识吧,

1.XMLHttpRequest与ajax还是有区别的,其实冲ajax的全写可看出ajax是HMLHttpReuqest中的异步模式,同步模式其实不是ajax.

2.XMLHttpRequest.open()的五个参数分别是:

第一个参数:提交类型,get或post

第二个参数:提交地址:url

第三个参数:提交的模式,异步还是同步,当设置为false表示同步

第四个参数和第五个参数是用作服务器验证的,用户名和密码,我还没用过,不解释。

12。   try {

// Set the correct header, if data is being sent

if ( s.data )

xml.setRequestHeader("Content-Type", s.contentType);

// Set the If-Modified-Since header, if ifModified mode.

if ( s.ifModified )

xml.setRequestHeader("If-Modified-Since",

jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );

// Set header so the called script knows that it's an XMLHttpRequest

xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");

// Set the Accepts header for the server, depending on the dataType

xml.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?

s.accepts[ s.dataType ] + ", */*" :

s.accepts._default );

} catch(e){}

设置发送的头部信息。

为什么要设?javascript核心技术指南说了,如果是web浏览器自动为建立的请求添加相关的cookie.只有当想要向服务器发送一个假的cookie的时候,

才需要显示的设置"cookie"头部。

为什么这么设?你得去向W3C或者什么规范文档组织去提问了。

13。 // Allow custom headers/mimetypes

if ( s.beforeSend )

s.beforeSend(xml);

定义自定义头部,很少用到

14. if ( s.global )

jQuery.event.trigger("ajaxSend", [xml, s]);

先忽略掉,估计得看jquery的事件模型了,不懂

15. var onreadystatechange = function(isTimeout){

// The transfer is complete and the data is available, or the request timed out

if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {

requestDone = true;

// clear poll interval

if (ival) {

clearInterval(ival);

ival = null;

}

status = isTimeout == "timeout" && "timeout" ||

!jQuery.httpSuccess( xml ) && "error" ||

s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||

"success";

if ( status == "success" ) {

// Watch for, and catch, XML document parse errors

try {

// process the data (runs the xml through httpData regardless of callback)

data = jQuery.httpData( xml, s.dataType );

} catch(e) {

status = "parsererror";

}

}

// Make sure that the request was successful or notmodified

if ( status == "success" ) {

// Cache Last-Modified header, if ifModified mode.

var modRes;

try {

modRes = xml.getResponseHeader("Last-Modified");

} catch(e) {} // swallow exception thrown by FF if header is not available

if ( s.ifModified && modRes )

jQuery.lastModified[s.url] = modRes;

// JSONP handles its own success callback

if ( !jsonp )

success();

} else

jQuery.handleError(s, xml, status);

// Fire the complete handlers

complete();

// Stop memory leaks

if ( s.async )

xml = null;

}

};

这段方法作者用了一个牛B的语句,看了我好长时间才看出点端倪:

status = isTimeout == "timeout" && "timeout" ||

!jQuery.httpSuccess( xml ) && "error" ||

s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||

"success";

充分展示了作者对于JS运算符优先级和或非运行细节的掌握。首先根据优先级使用括号进行分组:

status = ((isTimeout == "timeout") && "timeout") 

||(!jQuery.httpSuccess( xml ) && "error") 

                       ||((s.ifModified && jQuery.httpNotModified( xml, s.url ))&& "notmodified" )

                       ||"success";

执行过程如下,从左至右执行:

一:执行((isTimeout == "timeout") && "timeout") ,通常isTimeout为undefined,所以这个执行过程返回false,如果isTimeout="timeout"的话,那完 了,status="timeout",执行结束.

二:执行!jQuery.httpSuccess( xml ) && "error",判断返回状态是否是200可用,不可用就直接变成了status="error",执行结束

三:执行((s.ifModified && jQuery.httpNotModified( xml, s.url ))&& "notmodified" ),基本我们也用不到,因为s.ifModified默认是false

四:前三部执行都是false的情况下就变成了status="success";

之后就是解析数据,同样一个疑问jsonp不为空,那么执行什么?没看出来

16. if ( s.async ) {

// don't attach the handler to the request, just poll it instead

var ival = setInterval(onreadystatechange, 13); 

// Timeout checker

if ( s.timeout > 0 )

setTimeout(function(){

// Check to see if the request is still happening

if ( xml ) {

// Cancel the request

xml.abort();

if( !requestDone )

onreadystatechange( "timeout" );

}

}, s.timeout);

}

异步模式就需要设置超时时间,为了防止服务器长时间无反应的状态,当然可以自己设置超时时间,使用s.timeout来设置。

其中xml.abort()是取消请求

并且if( !requestDone )onreadystatechange( "timeout" );设置超时

17。 // Send the data

try {

xml.send(s.data);

} catch(e) {

jQuery.handleError(s, xml, null, e);

}

// firefox 1.5 doesn't fire statechange for sync requests

// 这个不明白,同步请求再执行一遍?什么不支持状态改变,再看。

if ( !s.async )

onreadystatechange();

function success(){

// If a local callback was specified, fire it and pass it the data

if ( s.success )

s.success( data, status );

// Fire the global callback

if ( s.global )

jQuery.event.trigger( "ajaxSuccess", [xml, s] );

}

function complete(){

// Process result

if ( s.complete )

s.complete(xml, status);

// The request was completed

if ( s.global )

jQuery.event.trigger( "ajaxComplete", [xml, s] );

// Handle the global AJAX counter

if ( s.global && ! --jQuery.active )

jQuery.event.trigger( "ajaxStop" );

}

// return XMLHttpRequest to allow aborting the request etc.

return xml;

这些操作就是发送操作了,整个jquery.ajax也就结束了.

奉上其中我解析的一段源代码,其实看jquery源文件最好,这里布局有点乱。

ajax: function( s ) {

var jsonp, jsre = /=\?(&|$)/g, status, data;

// Extend the settings, but re-extend 's' so that it can be

// checked again later (in the test suite, specifically)

s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));

// convert data if not already a string

if ( s.data && s.processData && typeof s.data != "string" )

s.data = jQuery.param(s.data);

// Handle JSONP Parameter Callbacks

if ( s.dataType == "jsonp" ) {

if ( s.type.toLowerCase() == "get" ) {

if ( !s.url.match(jsre) )

s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";

} else if ( !s.data || !s.data.match(jsre) )

s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";

s.dataType = "json";

}

// Build temporary JSONP function

if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {

jsonp = "jsonp" + jsc++;

// Replace the =? sequence both in the query string and the data

if ( s.data )

s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");

s.url = s.url.replace(jsre, "=" + jsonp + "$1");

// We need to make sure

// that a JSONP style response is executed properly

s.dataType = "script";

// Handle JSONP-style loading

window[ jsonp ] = function(tmp){

data = tmp;

success();

complete();

// Garbage collect

window[ jsonp ] = undefined;

try{ delete window[ jsonp ]; } catch(e){}

if ( head )

head.removeChild( script );

};

}

if ( s.dataType == "script" && s.cache == null )

s.cache = false;

if ( s.cache === false && s.type.toLowerCase() == "get" ) {

var ts = (new Date()).getTime();

// try replacing _= if it is there

var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");

// if nothing was replaced, add timestamp to the end

s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");

}

// If data is available, append data to url for get requests

if ( s.data && s.type.toLowerCase() == "get" ) {

s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;

// IE likes to send both get and post data, prevent this

s.data = null;

}

// Watch for a new set of requests

if ( s.global && ! jQuery.active++ )

jQuery.event.trigger( "ajaxStart" );

// If we're requesting a remote document

// and trying to load JSON or Script with a GET

if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && ( s.dataType == "script" || s.dataType =="json" ) && s.type.toLowerCase() == "get" ) {

var head = document.getElementsByTagName("head")[0];

var script = document.createElement("script");

script.src = s.url;

if (s.scriptCharset)

script.charset = s.scriptCharset;

// Handle Script loading

if ( !jsonp ) {

var done = false;

// Attach handlers for all browsers

script.onload = script.onreadystatechange = function(){

if ( !done && (!this.readyState || 

this.readyState == "loaded" || this.readyState == "complete") ) {

done = true;

success();

complete();

head.removeChild( script );

}

};

}

head.appendChild(script);

// We handle everything using the script element injection

return undefined;

}

var requestDone = false;

// Create the request object; Microsoft failed to properly

// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available

var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();

// Open the socket

xml.open(s.type, s.url, s.async, s.username, s.password);

// Need an extra try/catch for cross domain requests in Firefox 3

try {

// Set the correct header, if data is being sent

if ( s.data )

xml.setRequestHeader("Content-Type", s.contentType);

// Set the If-Modified-Since header, if ifModified mode.

if ( s.ifModified )

xml.setRequestHeader("If-Modified-Since",

jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );

// Set header so the called script knows that it's an XMLHttpRequest

xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");

// Set the Accepts header for the server, depending on the dataType

xml.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?

s.accepts[ s.dataType ] + ", */*" :

s.accepts._default );

} catch(e){}

// Allow custom headers/mimetypes

if ( s.beforeSend )

s.beforeSend(xml);

if ( s.global )

jQuery.event.trigger("ajaxSend", [xml, s]);

// Wait for a response to come back

var onreadystatechange = function(isTimeout){

// The transfer is complete and the data is available, or the request timed out

if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {

requestDone = true;

// clear poll interval

if (ival) {

clearInterval(ival);

ival = null;

}

status = isTimeout == "timeout" && "timeout" ||

!jQuery.httpSuccess( xml ) && "error" ||

s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||

"success";

if ( status == "success" ) {

// Watch for, and catch, XML document parse errors

try {

// process the data (runs the xml through httpData regardless of callback)

data = jQuery.httpData( xml, s.dataType );

} catch(e) {

status = "parsererror";

}

}

// Make sure that the request was successful or notmodified

if ( status == "success" ) {

// Cache Last-Modified header, if ifModified mode.

var modRes;

try {

modRes = xml.getResponseHeader("Last-Modified");

} catch(e) {} // swallow exception thrown by FF if header is not available

if ( s.ifModified && modRes )

jQuery.lastModified[s.url] = modRes;

// JSONP handles its own success callback

if ( !jsonp )

success();

} else

jQuery.handleError(s, xml, status);

// Fire the complete handlers

complete();

// Stop memory leaks

if ( s.async )

xml = null;

}

};

if ( s.async ) {

// don't attach the handler to the request, just poll it instead

var ival = setInterval(onreadystatechange, 13); 

// Timeout checker

if ( s.timeout > 0 )

setTimeout(function(){

// Check to see if the request is still happening

if ( xml ) {

// Cancel the request

xml.abort();

if( !requestDone )

onreadystatechange( "timeout" );

}

}, s.timeout);

}

// Send the data

try {

xml.send(s.data);

} catch(e) {

jQuery.handleError(s, xml, null, e);

}

// firefox 1.5 doesn't fire statechange for sync requests

if ( !s.async )

onreadystatechange();

function success(){

// If a local callback was specified, fire it and pass it the data

if ( s.success )

s.success( data, status );

// Fire the global callback

if ( s.global )

jQuery.event.trigger( "ajaxSuccess", [xml, s] );

}

function complete(){

// Process result

if ( s.complete )

s.complete(xml, status);

// The request was completed

if ( s.global )

jQuery.event.trigger( "ajaxComplete", [xml, s] );

// Handle the global AJAX counter

if ( s.global && ! --jQuery.active )

jQuery.event.trigger( "ajaxStop" );

}

// return XMLHttpRequest to allow aborting the request etc.

return xml;

},

其实还有一些出了我的疑问外还有些像exnted和event这些在JQUERY的实现可以仔细分析分析。不过我想能看懂上面的这段代码,至少在使 用jquery.ajax进行大部分的ajax应用中都可以灵活使用了。初次写文章,如果你们看不懂就不要指责我了,因为我知道这是事实但是文采不行也没 办法,如果有错误请尽量批评我这个傻帽,然后指点错误,感激感激。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics