6.9 其他工具

jQuery的Ajax工具箱中包含的工具非常丰富,前面我们介绍的只是其中一小部分。鉴于有用的工具确实很多,下面我们就概述一些定制Ajax通信过程中较为重要的工具。

6.9.1 低级Ajax方法

前面已经介绍了一些用于启动Ajax通信的方法。但在内部,jQuery会把这些方法都对象为$.ajax()全局函数的一种变体。这个函数不针对任何特定的Ajax通信类型,而是接收一个选项对象参数,并根据该参数来决定相应的行为。

我们介绍的第一个例子,是使用$('#dictionary').load('a.html')加载HTML片段。同样的操作如果使用$.ajax()来实现,应该如代码清单6-21所示。

代码清单6-21

  1. $.ajax({
  2. url: 'a.html',
  3. success: function(data) {
  4. $('#dictionary').html(data);
  5. }
  6. });

这里,$.ajax()接受了一个包含30余项设置(settings)的对象作为参数(或者一个URL字符串作为第一个参数,一个对象作为第二个参数),提供了极大的灵活性。使用低级的$.ajax()函数时,可以获得下列特殊的好处。

  • 避免浏览器缓存来自服务器的响应。非常适合服务器动态生成数据的情况。

  • 抑制正常情况下所有Ajax交互都可以触发的全局处理程序(例如通过$.ajaxStart()注册的处理程序)。

  • 在远程主机需要认证的情况下,可以提供用户名和密码。

要了解如何利用上述及其他特性,请参考在线API(http://api.jquery.com/jQuery.Ajax)。

6.9.2 修改默认选项

使用 $.ajaxSetup() 函数可以修改调用 Ajax 方法时每个选项的默认值。这个函数与$.ajax()接受相同的选项对象参数,之后的所有Ajax请求都将使用传递给该函数的选项——除非明确覆盖,参见代码清单6-22。

代码清单6-22

  1. $.ajaxSetup({
  2. url: 'a.html',
  3. type: 'POST',
  4. dataType: 'html'
  5. });
  6. $.ajax({
  7. type: 'GET',
  8. success: function(data) {
  9. $('#dictionary').html(data);
  10. }
  11. });

这里的操作与前面使用$.ajax()时实现的操作相同,不过由于已经通过$.ajaxSetup()为请求指定了默认的URL,因此调用$.ajax()时就不需要再指定该选项了。相对而言,虽然已经把type参数的默认值指定为POST,但在$.ajax()调用中仍然可以覆盖这个值,将其修改为GET

6.9.3 部分加载HTML页面

本章讨论的第一种,也是最简单的一种Ajax技术,就是取得并将HTML片段插入到当前页面中。不过,有时候服务器提供的页面中虽然包含我们需要的部分,但该部分之外的HTML却不是我们所需要的。当遇到这种服务器不能提供适当的数据格式的情况时,也可以在客户端求助于jQuery。

如果在本章第一个例子中,我们需要的字典解释包含在如下所示的完整的HTML页面(h.html)中:

  1. <html lang="en">
  2. <head>
  3. <meta charset="utf-8"/>
  4. <title>The Devil's Dictionary: H</title>
  5. <link rel="stylesheet" href="dictionary.css"
  6. media="screen" />
  7. </head>
  8. <body>
  9. <div id="container">
  10. <div id="header">
  11. <h2>The Devil's Dictionary: H</h2>
  12. <div class="author">by Ambrose Bierce</div>
  13. </div>
  14. <div id="dictionary">
  15. <div class="entry">
  16. <h3 class="term">HABEAS CORPUS</h3>
  17. <div class="part">n.</div>
  18. <div class="definition">
  19. A writ by which a man may be taken out of jail
  20. when confined for the wrong crime.
  21. </div>
  22. </div>
  23. <div class="entry">
  24. <h3 class="term">HABIT</h3>
  25. <div class="part">n.</div>
  26. <div class="definition">
  27. A shackle for the free.
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. </body>
  33. </html>

那么,可以通过代码清单6-1中的技术把整个文档都加载到页面中,如代码清单6-23所示。

代码清单6-23

  1. //未完成的代码
  2. $(document).ready(function() {
  3. $('#letter-h a').click(function(event) {
  4. event.preventDefault();
  5. $('#dictionary').load('h.html');
  6. });
  7. });

不过产生的结果并不理想,因为文档中包含不需要的内容(加载的内容中包含页面标题和作者名,这显然与已有内容重复了),如图6-13所示。

6.9 其他工具 - 图1

图 6-13

要去掉页面中多余的内容,可以利用.load()的一些新特性——在指定要加载文档的URL时,也可以提供一个jQuery选择符表达式。如果指定了这个表达式,.load()方法就会利用它查找加载文档的匹配部分。最终,只有匹配的部分才会被插入到页面中。具体来说,我们可以利用这个技术,只取得文档中的词条部分,然后插入到页面中,如代码清单6-24所示。

代码清单6-24

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

这样,文档中无关的部分已经从页面中去掉了,如图6-14所示。

6.9 其他工具 - 图2

图 6-14