jquery::ajaxStop()与jquery::ajaxComplete()的区别

38

在何时使用哪个方法:

http://api.jquery.com/ 的文档中:

关于 ajaxStop() 的描述如下:

说明:注册一个处理程序,在所有 Ajax 请求完成时调用。这是一个 Ajax 事件。

而对于 ajaxComplete(),它的描述如下:

说明:注册一个处理程序,当 Ajax 请求完成时调用。这是一个 Ajax 事件。

从我的观察来看,ajaxComplete() 更加灵活,因为:

无论哪个 Ajax 请求完成,都会调用所有 ajaxComplete 处理程序。如果我们必须区分请求,则可以使用传递给处理程序的参数。每次执行 ajaxComplete 处理程序时,都会传递事件对象、XMLHttpRequest 对象和用于创建请求的设置对象。

有人能解释一下每个方法的作用以及各自的合适用法吗? 在我最近构建的一个应用程序中,我依赖于 ajaxStop() 来在我的 ajax 调用完成时触发。然后,我会解析返回的数据以获取服务器端操作的结果。现在我开始思考是否应该改用 ajaxComplete(),或者在不同情况下使用两种方法的组合。

谢谢大家的思考。


我无法弄清楚为什么会出现错误“ajaxComplete不是函数”。请确保不要使用jQuery的“slim”版本:https://dev59.com/JVsW5IYBdhLWcg3wFT2n#35424465 - Ryan
3个回答

60
简而言之,它们有不同的用途,所以答案是“在各种情况下都需要两者的组合”。基本规则如下:
  • .ajaxComplete() - 运行于每个请求完成时,当您想要对每个请求/结果执行某些操作时,请使用此选项。请注意,这不会替换success处理程序,因为解析后的数据不是其中一个参数(并且即使出现错误也会运行)- 您可能需要在某些每个请求的情况下改用.ajaxSuccess()
  • .ajaxStop() - 运行于每批请求完成时,通常与.ajaxStart()结合使用,用于显示/隐藏某种“加载中...”指示器或在AJAX请求批次完成后执行其他操作,例如主控制步骤。

如果您正在使用此功能来解析数据,则可能有更好的方法,在这种情况下可以使用$.ajaxSetup(),在其中可以指定获取已解析数据(例如JSON响应将是对象)的success处理程序,如下所示:

$.ajaxSetup({
  success: function(data) { 
    //do something with data, for JSON it's already an object, etc.
  }
});

我收到了ajax成功的回调。什么时候应该使用ajaxStop而不是complete? - Chris
8
.ajaxStop() 在一批请求完成时触发,即使您发出了 5 个请求,无论它们以什么顺序返回,当第 5 个请求完成时就会触发,因此在那时没有 AJAX 请求等待结果,您已经完成了所有请求。这意味着它没有关于已完成的特定请求的任何信息,因为它不是针对一个请求的,而是针对所有请求的。 ajaxComplete每个请求进行触发,并带有每个请求的XMLHttpRequest对象...所以您可以处理有关该请求的一些信息...这完全取决于您实际在做什么,哪个更合适。 - Nick Craver
1
啊,我读了几遍并看了评论才明白。重点是.ajaxStop()在没有未完成的Ajax请求时运行,而.ajaxComplete()在每个已完成的Ajax请求之后运行。谢谢! - steve

8

ajaxComplete会在每个ajax请求结束时调用,无论成功与否。

ajaxStop会在所有的ajax请求完成后调用。与ajaxComplete不同,如果仍有请求正在进行中,则不会调用它。

如果您想要针对每个ajax请求执行操作,应该使用第一个。


3
一般情况下,您应该使用ajaxComplete。这是因为只有当没有更多的ajax请求等待返回时,ajaxStop才会被触发。当您一次发送一个ajax请求时,这似乎并没有什么不同,但想象一下,如果在您发送请求A后网络变慢,在5秒后发送请求B,请求B比请求A更早返回...那么ajaxStop将在请求A返回后仅触发一次,而ajaxComplete将两次触发。
您需要使用ajaxStop的情况是,当您一次性发送多个ajax请求时...例如提交一系列3个表单,并希望在所有3个成功完成时得到通知。当然,您可以在ajaxComplete中使用计数器来实现相同的功能。
但是,根据您的问题描述...您想从每个ajax响应中解析数据...通常在ajax成功回调函数中完成此操作,例如:
$.ajax({
   url: "blah",
   data: "blah",
   success: function (data) { /* Code in here */ }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接