AJAX - 服务器响应

onreadystatechange 属性

readyState 属性存留 XMLHttpRequest 的状态。

onreadystatechange 属性定义当 readyState 发生变化时执行的函数。

status 属性和 statusText 属性存有 XMLHttpRequest 对象的状态。

属性 描述
onreadystatechange 定义了当 readyState 属性发生改变时所调用的函数。
readyState 保存了 XMLHttpRequest 的状态。 0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 正在处理请求
4: 请求已完成且响应已就绪
status 200: "OK"
403: "Forbidden"
404: "Page not found"
如需完整列表,请访问 Http 消息参考手册
statusText 返回状态文本(例如 "OK" 或 "Not Found")

每当 readyState 发生变化时就会调用 onreadystatechange 函数。

当 readyState 为 4,status 为 200 时,响应就绪:

实例

  1. function loadDoc() {
  2. var xhttp = new XMLHttpRequest();
  3. xhttp.onreadystatechange = function() {
  4. if (this.readyState == 4 && this.status == 200) {
  5. document.getElementById("demo").innerHTML =
  6. this.responseText;
  7. }
  8. };
  9. xhttp.open("GET", "ajax_info.txt", true);
  10. xhttp.send();
  11. }

注释:onreadystatechange 被触发五次(0-4),每次 readyState 都发生变化。

使用回调函数

回调函数是一种作为参数被传递到另一个函数的函数。

如果您的网站中有多个 AJAX 任务,那么您应该创建一个执行 XMLHttpRequest 对象的函数,以及一个供每个 AJAX 任务的回调函数。

该函数应当包含 URL 以及当响应就绪时调用的函数。

实例

  1. loadDoc("url-1", myFunction1);
  2.  
  3. loadDoc("url-2", myFunction2);
  4.  
  5. function loadDoc(url, cFunction) {
  6. var xhttp;
  7. xhttp = new XMLHttpRequest();
  8. xhttp.onreadystatechange = function() {
  9. if (this.readyState == 4 && this.status == 200) {
  10. cFunction(this);
  11. }
  12. };
  13. xhttp.open("GET", url, true);
  14. xhttp.send();
  15. }
  16.  
  17. function myFunction1(xhttp) {
  18. // action goes here
  19. }
  20. function myFunction2(xhttp) {
  21. // action goes here
  22. }

服务器响应属性

属性 描述
responseText 获取字符串形式的响应数据
responseXML 获取 XML 数据形式的响应数据

服务器响应方法

方法 描述
getResponseHeader() 从服务器返回特定的头部信息
getAllResponseHeaders() 从服务器返回所有头部信息

responseText 属性

responseText 属性以 JavaScript 字符串的形式返回服务器响应,因此您可以这样使用它:

实例

  1. document.getElementById("demo").innerHTML = xhttp.responseText;

responseXML 属性

XML HttpRequest 对象有一个內建的 XML 解析器。

ResponseXML 属性以 XML DOM 对象返回服务器响应。

使用此属性,您可以把响应解析为 XML DOM 对象:

实例

请求文件 music_list.xml,并对响应进行解析:

  1. <CATALOG>
  2. <TRACK>
  3. <TITLE>再见</TITLE>
  4. <ARTIST>邓紫棋</ARTIST>
  5. <ALBUM>新的心跳</ALBUM>
  6. <COUNTRY>中国</COUNTRY>
  7. <COMPANY>邓紫棋工作室</COMPANY>
  8. <YEAR>2016</YEAR>
  9. </TRACK>
  10. <TRACK>
  11. <TITLE>All I Ask</TITLE>
  12. <ARTIST>Adele</ARTIST>
  13. <ALBUM>25</ALBUM>
  14. <COUNTRY>英国</COUNTRY>
  15. <COMPANY>XL Recordings</COMPANY>
  16. <YEAR>2015</YEAR>
  17. </TRACK>
  18. <TRACK>
  19. <TITLE>之乎者也</TITLE>
  20. <ARTIST>罗大佑</ARTIST>
  21. <ALBUM>青春舞曲</ALBUM>
  22. <COUNTRY>中国</COUNTRY>
  23. <COMPANY>滚石唱片</COMPANY>
  24. <YEAR>1982</YEAR>
  25. </TRACK>
  26. <TRACK>
  27. <TITLE>Never Be Alone</TITLE>
  28. <ARTIST>Shawn Mendes</ARTIST>
  29. <ALBUM>Handwritten</ALBUM>
  30. <COUNTRY>加拿大</COUNTRY>
  31. <COMPANY>环球唱片</COMPANY>
  32. <YEAR>2015</YEAR>
  33. </TRACK>
  34. <TRACK>
  35. <TITLE>慢慢</TITLE>
  36. <ARTIST>张学友</ARTIST>
  37. <ALBUM>忘记你我做不到</ALBUM>
  38. <COUNTRY>中国</COUNTRY>
  39. <COMPANY>环球唱片</COMPANY>
  40. <YEAR>1996</YEAR>
  41. </TRACK>
  42. <TRACK>
  43. <TITLE>Complicated</TITLE>
  44. <ARTIST>Avril Lavigne</ARTIST>
  45. <ALBUM>Let Go</ALBUM>
  46. <COUNTRY>加拿大</COUNTRY>
  47. <COMPANY>索尼音乐</COMPANY>
  48. <YEAR>2002</YEAR>
  49. </TRACK>
  50. <TRACK>
  51. <TITLE>三生三世</TITLE>
  52. <ARTIST>张杰</ARTIST>
  53. <ALBUM>三生三世十里桃花</ALBUM>
  54. <COUNTRY>中国</COUNTRY>
  55. <COMPANY>仁溪音乐</COMPANY>
  56. <YEAR>2018</YEAR>
  57. </TRACK>
  58. <TRACK>
  59. <TITLE>Five Hundred Miles</TITLE>
  60. <ARTIST>Justin Timberlake</ARTIST>
  61. <ALBUM>Inside Llewyn Davis</ALBUM>
  62. <COUNTRY>美国</COUNTRY>
  63. <COMPANY>华纳唱片</COMPANY>
  64. <YEAR>2013</YEAR>
  65. </TRACK>
  66. <TRACK>
  67. <TITLE>演员</TITLE>
  68. <ARTIST>薛之谦</ARTIST>
  69. <ALBUM>绅士</ALBUM>
  70. <COUNTRY>中国</COUNTRY>
  71. <COMPANY>海蝶音乐</COMPANY>
  72. <YEAR>2016</YEAR>
  73. </TRACK>
  74. <TRACK>
  75. <TITLE>Numb</TITLE>
  76. <ARTIST>Linkin Park</ARTIST>
  77. <ALBUM>Meteora</ALBUM>
  78. <COUNTRY>美国</COUNTRY>
  79. <COMPANY>华纳唱片</COMPANY>
  80. <YEAR>2003</YEAR>
  81. </TRACK>
  82. <TRACK>
  83. <TITLE>给未来的自己</TITLE>
  84. <ARTIST>梁静茹</ARTIST>
  85. <ALBUM>崇拜</ALBUM>
  86. <COUNTRY>马来西亚</COUNTRY>
  87. <COMPANY>相信音乐</COMPANY>
  88. <YEAR>2007</YEAR>
  89. </TRACK>
  90. <TRACK>
  91. <TITLE>The Monster</TITLE>
  92. <ARTIST>Rihanna</ARTIST>
  93. <ALBUM>The Marshall Mathers LP2</ALBUM>
  94. <COUNTRY>巴巴多斯</COUNTRY>
  95. <COMPANY>环球唱片</COMPANY>
  96. <YEAR>2013</YEAR>
  97. </TRACK>
  98. <TRACK>
  99. <TITLE>我终于失去了你</TITLE>
  100. <ARTIST>赵传</ARTIST>
  101. <ALBUM>我终于失去了你</ALBUM>
  102. <COUNTRY>中国</COUNTRY>
  103. <COMPANY>滚石唱片</COMPANY>
  104. <YEAR>1989</YEAR>
  105. </TRACK>
  106. <TRACK>
  107. <TITLE>Main Titles</TITLE>
  108. <ARTIST>Ramin Djawadi</ARTIST>
  109. <ALBUM>Game of Thrones</ALBUM>
  110. <COUNTRY>德国</COUNTRY>
  111. <COMPANY>索尼音乐</COMPANY>
  112. <YEAR>2011</YEAR>
  113. </TRACK>
  114. <TRACK>
  115. <TITLE>传奇</TITLE>
  116. <ARTIST>李健</ARTIST>
  117. <ALBUM>似水流年</ALBUM>
  118. <COUNTRY>中国</COUNTRY>
  119. <COMPANY>北京完美坚持文化艺术工作室</COMPANY>
  120. <YEAR>2003</YEAR>
  121. </TRACK>
  122. <TRACK>
  123. <TITLE>完美生活</TITLE>
  124. <ARTIST>许巍</ARTIST>
  125. <ALBUM>时光漫步</ALBUM>
  126. <COUNTRY>中国</COUNTRY>
  127. <COMPANY>金牌大风</COMPANY>
  128. <YEAR>2002</YEAR>
  129. </TRACK>
  130. </CATALOG>
  1. xmlDoc = xhttp.responseXML;
  2. txt = "";
  3. x = xmlDoc.getElementsByTagName("ARTIST");
  4. for (i = 0; i < x.length; i++) {
  5. txt += x[i].childNodes[0].nodeValue + "<br>";
  6. }
  7. document.getElementById("demo").innerHTML = txt;
  8. xhttp.open("GET", "music_list.xml", true);
  9. xhttp.send();

您将在本教程的 DOM 章节学到更多有关 XML DOM 的知识。

getAllResponseHeaders() 方法

getAllResponseHeaders() 方法返回所有来自服务器响应的头部信息。

实例

  1. var xhttp = new XMLHttpRequest();
  2. xhttp.onreadystatechange = function() {
  3. if (this.readyState == 4 && this.status == 200) {
  4. document.getElementById("demo").innerHTML = this.getAllResponseHeaders();
  5. }
  6. };

getResponseHeader() 方法

getResponseHeader() 方法返回来自服务器响应的特定头部信息。

实例

  1. var xhttp = new XMLHttpRequest();
  2. xhttp.onreadystatechange = function() {
  3. if (this.readyState == 4 && this.status == 200) {
  4. document.getElementById("demo").innerHTML = this.getResponseHeader("Last-Modified");
  5. }
  6. };
  7. xhttp.open("GET", "ajax_info.txt", true);
  8. xhttp.send();