我似乎无法找到明确的答案,而the documentation并没有明确说清楚。
根据我的理解以及other answers提到的内容,全球ajaxComplete
事件发生在全球ajaxSuccess
或ajaxError
事件之后。
话虽如此,这两组事件之间的时间关系是什么?
ajaxComplete
/ ajaxSuccess
启动后,ajaxError
只能保证启动吗? ajaxComplete
/ ajaxSuccess
完成后,ajaxError
保证会开始吗? 作为一些背景知识,我尝试确保我的ajaxComplete
处理程序在ajaxSuccess
/ ajaxError
处理程序完成后才会运行。
答案 0 :(得分:3)
ajaxComplete
在ajaxSuccess
/ ajaxError
处理程序完成后触发。
这里是jQuery 2.1.4中的相关代码(在jQuery 1.11.3中也是如此):
// Status-dependent callbacks
jqXHR.statusCode( statusCode );
statusCode = undefined;
if ( fireGlobals ) {
globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
[ jqXHR, s, isSuccess ? success : error ] );
}
// Complete
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
if ( fireGlobals ) {
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
// Handle the global AJAX counter
if ( !( --jQuery.active ) ) {
jQuery.event.trigger("ajaxStop");
}
}
为了验证它,我设置了一个实验,我可以随意指定ajaxSuccess
处理程序完成所需的时间。
$(document).ajaxSuccess(function (e, xhr, settings) {
var startTime = (new Date()).getTime();
// Intentionally waste an arbitrary length of time
while ( (new Date()).getTime() - startTime < 1000 ) { }
var endTime = (new Date()).getTime();
console.log('ajaxSuccess\n'
+ ' Start: ' + startTime + '\n'
+ ' End: ' + endTime
);
});
$(document).ajaxComplete(function (e, xhr, settings) {
var startTime = (new Date()).getTime();
console.log('ajaxComplete\n'
+ ' Start: ' + startTime
);
});
$.get('/');
实验证实了我之前观察到的内容,即ajaxSuccess
/ ajaxError
始终在ajaxComplete
开始之前完成,无论花费多长时间。
答案 1 :(得分:0)
<强>事件强>
这是Ajax事件的完整列表,以及它们的顺序 被触发。每个都会触发缩进事件 Ajax请求(除非已设置全局选项)。 ajaxStart和 ajaxStop事件是与所有Ajax请求相关的事件。
- ajaxStart(全局事件):如果是Ajax,则会触发此事件 请求已启动,当前没有其他Ajax请求正在运行
- beforeSend(本地事件):此事件在启动Ajax请求之前触发,允许您修改XMLHttpRequest object(如果需要,设置其他标题。)
- ajaxSend(全球 事件):在请求运行之前也会触发此全局事件。
- success(本地事件):仅在请求成功时调用此事件(服务器没有错误,数据没有错误)。
- ajaxSuccess(全局事件):此事件也仅在调用时调用 请求成功。
- error(本地事件):仅当请求发生错误时才会调用此事件(您永远不会同时出现错误和带有请求的成功回调)。
- ajaxError(全局事件):此全局事件的行为与本地错误事件相同。
- complete(本地事件):无论请求是否成功,都会调用此事件。即使是同步请求,您也将始终收到完整的回调。
- ajaxComplete(全局事件):此事件的行为与complete事件相同,并且每次Ajax请求完成时都会触发。
- ajaxStop(全局事件):如果没有更多的Ajax请求被处理,则会触发此全局事件。