6.5 关注请求

到现在为止,我们已经学习了如何调用Ajax方法,并且始终都在处理响应。然而,有时候多了解一些调用Ajax方法过程中的HTTP请求也会给我们带来方便。为满足这种需求,jQuery提供了一组函数,通过它们能够为各种与Ajax相关的事件注册回调函数

其中,.ajaxStart().ajaxStop()方法就是这些“观察员”函数中的两个例子,可以把它们添加给任何jQuery对象。当Ajax请求开始且尚未进行其他传输时,会触发.ajaxStart()的回调函数。相反,当最后一次活动请求终止时,则会执行通过.ajaxStop()注册的回调函数。所有这些“观察员”都是全局性的,因为无论创建它们的代码位于何处,当Ajax通信发生时都需要调用它们。而且这些方法都与.ready()方法一样,只能由$(document)调用。

在网络连接的速度比较慢时,可以通过这些方法为用户提供一些反馈。页面中用作反馈的HTML可以包含适当的Loading…(加载中)信息,例如:

  1. <div id="loading">
  2. Loading...
  3. </div>

反馈信息就是一个HTML片段,比如可以包含用作动态指示器的一幅动态GIF图像。此时,可以在CSS文件中添加一些简单的样式,这样当显示该信息时,页面的外观如图6-11所示。

6.5 关注请求 - 图1

图 6-11

但是,依照渐进增强的原则,我们并没有把HTML标记直接放在页面中。因为这段信息只能在JavaScript有效的情况下使用,所以应该通过jQuery来插入它:

  1. $(document).ready(function() {
  2. $('<div id="loading">Loading...</div>')
  3. .insertBefore('#dictionary')
  4. });

而在CSS文件中,我们为这个<div>添加了一条display:none;样式规则,以便在初始时隐藏这条信息。要在恰当的时机显示这条信息,只需通过.ajaxStart()将它注册为一个“观察员”即可:

  1. $(document).ready(function() {
  2. var $loading = $('<div id="loading">Loading...</div>')
  3. .insertBefore('#dictionary');
  4. $(document).ajaxStart(function() {
  5. $loading.show();
  6. });
  7. });

而且,可以在此基础上继续连缀相应的隐藏行为:

代码清单6-15

  1. $(document).ready(function() {
  2. var $loading = $('<div id="loading">Loading...</div>')
  3. .insertBefore('#dictionary');
  4. $(document).ajaxStart(function() {
  5. $loading.show();
  6. }).ajaxStop(function() {
  7. $loading.hide();
  8. });
  9. });

好的!我们的加载反馈系统已经就位了。

同样,我们注意到,这两个方法没有通过特别的方式与Ajax通信的开始建立联系。链接A上的.load()和链接B上的.getJSON()都可以导致反馈操作发生。

在这种情况下,全局行为是有必要的。假如我们想要建立具体的联系,也有一些可控的选项。某些观察员方法,如.ajaxError(),会向它们的回调函数发送一个对XMLHttpRequest对象的引用。这样就可以做到区别不同的请求来提供不同的行为。其他更具体的处理可以通过使用低级的$.ajax()函数来完成。

不过,与请求最常见的交互方式(我们已经介绍过了),是成功(success)回调函数。在前面的几个例子中,我们就是使用这个回调函数来解析从服务器返回的数据,然后将结果填充到页面上。当然,也可以使用其他回调函数。现在,仍然以代码清单6-1中使用的.load()方法为例:

  1. $(document).ready(function() {
  2. $('#letter-a a').click(function(event) {
  3. event.preventDefault();
  4. $('#dictionary').load('a.html');
  5. });
  6. });

此时,通过使加载的内容淡入视图而不是突然出现,可以从视觉上加入一些增强的效果。.load()方法可以接受一个加载完成时触发的回调函数,参见代码清单6-16。

代码清单6-16

  1. $(document).ready(function() {
  2. $('#letter-a a').click(function(event) {
  3. event.preventDefault();
  4. $('#dictionary').hide().load('a.html', function() {
  5. $(this).fadeIn();
  6. });
  7. });
  8. });

以上代码首先隐藏了目标元素,然后开始加载。当加载完成时,又通过回调函数以淡入方式逐渐显示出新生成的元素。