6-1 jQuery.ajax做的那些事
本节编程练习不计算学习进度,请电脑登录imooc.com操作

jQuery.ajax做的那些事

我们知道 Ajax 的底层实现其实是很简单的(抛开IE不说),标准的 w3c 直接提供了 XMLHttpRequest 方法。我们主要站在设计的角度来理解,如何设计出低耦合高内聚的代码 jQuery 对 Ajax 的处理主要体现在对浏览器兼容,数据的处理过滤以及各种事件的封装上,主要有以下几部分扩展:

提供快捷接口
提供底层接口
提供数据序列化
提供全局 Ajax 事件处理

分析下面一个demo

给 document 绑定 ajaxStart、ajaxComplete 回调事件,trigger 绑定一个点击事件。通过 click 触发事件发送一个 ajax 请求,并且通过 complete、done、ajaxStart、ajaxComplete 返回状态回调。

$(document).ajaxStart(function() {
    console.log(arguments)
}).ajaxComplete(function() {
    $(".log").text("Triggered ajaxComplete handler.");
});

$(".trigger").click(function() {
    //发送ajax请求
    $.ajax({
        url: "php.html",
        context: document.body,
        complete: function() {
            console.log(this)
        }
    }).done(function() {
        console.log(this)
    });
});
 

这里实现比较特别的地方,针对 ajax 提供 3 种回调方式:

  1. 内部回调 beforeSend, error, dataFilter, success 和 complete等
  2. 外部的 done、fail、when、always 等
  3. 全局 document 上都能捕获到 ajax 的每一步的回调通知 .ajaxStart(), .ajaxStop(),.ajaxComplete(), .ajaxError(), .ajaxSuccess(), .ajaxSend()等

换句话说,针对ajax的请求,每一步的状态、成功、失败或者进行中,我们有 3 种方式可以监听,但是每一种还是有各自的区别:

  1. Ajax的参数回调
  2. 基于 deferred 方式的 done 回调
  3. 全局的的自定义事件的回调
那么我们思考下为什么要设计这么多接口?这么多功能怎么融合在一起的?

任务

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
  5. <script src="http://code.jquery.com/jquery-latest.js"></script>
  6. <title>ajax</title>
  7. <style type="text/css">
  8. div{
  9. width: 150px;
  10. height: 50px;
  11. border: 5px solid #ccc;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16.  
  17. <div id="aaron1" style="background:yellow;border:20px solid #ccc;">点击触发Ajax成功请求</div>
  18. <div id="aaron2" style="background:red;border:20px solid #ccc;">点击触发Ajax失败请求</div>
  19. </br>
  20. 回调触发的循序
  21. <ul></ul>
  22.  
  23. <script type="text/javascript">
  24.  
  25. var $ul = $('ul')
  26.  
  27. function show(data){
  28. $ul.append('<li>'+ data +'</li>');
  29. }
  30.  
  31. //全局事件触发
  32. $(document).ajaxSend(function() {
  33. show('全局事件ajaxSend ')
  34. }).ajaxSuccess(function() {
  35. show("全局事件ajaxSuccess");
  36. }).ajaxError(function() {
  37. show("全局事件ajaxError");
  38. }).ajaxComplete(function() {
  39. show('全局事件ajaxComplete')
  40. })
  41.  
  42. function ajax(url) {
  43. //执行一个异步的HTTP(Ajax)的请求。
  44. var ajax = $.ajax({
  45. url: url,
  46. dataType: 'script',
  47. //这个对象用于设置Ajax相关回调函数的上下文
  48. context: document.body,
  49. //请求发送前的回调函数,用来修改请求发送前jqXHR
  50. beforeSend: function(xhr) {
  51. xhr.overrideMimeType("text/plain; charset=x-user-defined");
  52. show('局部事件beforeSend')
  53. },
  54. //请求完成后回调函数 (请求success 和 error之后均调用)
  55. complete: function() {
  56. show('局部事件complete')
  57. },
  58. error: function() {
  59. show('局部事件error请求失败时调用此函数')
  60. },
  61. success: function() {
  62. show('局部事件success')
  63. }
  64. })
  65.  
  66. ajax.done(function() {
  67. show('done')
  68. }).fail(function() {
  69. show('fail')
  70. }).always(function() {
  71. show('always')
  72. })
  73. }
  74.  
  75. $("#aaron1").click(function() {
  76. $ul.empty();
  77. ajax("http://code.jquery.com/jquery-latest.js")
  78. });
  79.  
  80.  
  81. $("#aaron2").click(function() {
  82. $ul.empty();
  83. ajax("#")
  84. });
  85.  
  86. </script>
  87. </body>
  88. </html>
下一节