XMLHttpRequest 对象

XMLHttpRequest 对象用于在后台与服务器交换数据。


什么是 XMLHttpRequest 对象?

XMLHttpRequest 对象用于在后台与服务器交换数据。

XMLHttpRequest 对象是开发者的梦想,因为您能够:

  • 在不重新加载页面的情况下更新网页
  • 在页面已加载后从服务器请求数据
  • 在页面已加载后从服务器接收数据
  • 在后台向服务器发送数据

所有现代的浏览器都支持 XMLHttpRequest 对象。


创建 XMLHttpRequest 对象

所有现代浏览器 (IE7+、Firefox、Chrome、Safari 以及 Opera) 都内置了 XMLHttpRequest 对象。

通过一行简单的 JavaScript 代码,我们就可以创建 XMLHttpRequest 对象。

创建 XMLHttpRequest 对象的语法:
  1. xmlhttp=new XMLHttpRequest();
老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:
  1. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

提示:在下一章,我们将使用 XMLHttpRequest 对象从服务器取回 XML 信息。


实例 1

  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. var xmlhttp;
  5. function loadXMLDoc(url) {
  6. xmlhttp = null;
  7. if (window.XMLHttpRequest) {// code for IE7, Firefox, Opera, etc.
  8. xmlhttp = new XMLHttpRequest();
  9. }
  10. else if (window.ActiveXObject) {// code for IE6, IE5
  11. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  12. }
  13. if (xmlhttp != null) {
  14. xmlhttp.onreadystatechange = state_Change;
  15. xmlhttp.open("GET", url, true);
  16. xmlhttp.send(null);
  17. }
  18. else {
  19. alert("Your browser does not support XMLHTTP.");
  20. }
  21. }
  22. function state_Change() {
  23. if (xmlhttp.readyState == 4) {// 4 = "loaded"
  24. if (xmlhttp.status == 200) {// 200 = "OK"
  25. document.getElementById('A1').innerHTML = xmlhttp.status;
  26. document.getElementById('A2').innerHTML = xmlhttp.statusText;
  27. document.getElementById('A3').innerHTML = xmlhttp.responseText;
  28. }
  29. else {
  30. alert("Problem retrieving XML data:" + xmlhttp.statusText);
  31. }
  32. }
  33. }
  34. </script>
  35. </head>
  36. <body>
  37. <h2>Using the HttpRequest Object</h2>
  38. <p>
  39. <b>Status:</b>
  40. <span id="A1"></span>
  41. </p>
  42. <p>
  43. <b>Status text:</b>
  44. <span id="A2"></span>
  45. </p>
  46. <p>
  47. <b>Response:</b>
  48. <br><span id="A3"></span>
  49. </p>
  50. <button onclick="loadXMLDoc('/example/xml/note.xml')">Get XML</button>
  51. </body>
  52. </html>

注释:onreadystatechange 是一个事件句柄。它的值 (state_Change) 是一个函数的名称,当 XMLHttpRequest 对象的状态发生改变时,会触发此函数。状态从 0 (uninitialized) 到 4 (complete) 进行变化。仅在状态为 4 时,我们才执行代码。

为什么使用 Async=true ?

我们的实例在 open() 的第三个参数中使用了 "true"。

该参数规定请求是否异步处理。

True 表示脚本会在 send() 方法之后继续执行,而不等待来自服务器的响应。

onreadystatechange 事件使代码复杂化了。但是这是在没有得到服务器响应的情况下,防止代码停止的最安全的方法。

通过把该参数设置为 "false",可以省去额外的 onreadystatechange 代码。如果在请求失败时是否执行其余的代码无关紧要,那么可以使用这个参数。


XML / ASP.Net

您也可以把 XML 文档打开并发送到服务器上的 ASP.Net 页面,分析此请求,然后传回结果。

  1. <html>
  2. <body>
  3. <script type="text/javascript">
  4. xmlHttp = null;
  5. if (window.XMLHttpRequest) {
  6. // code for IE7, Firefox, Opera, etc.
  7. xmlHttp = new XMLHttpRequest();
  8. }
  9. else if (window.ActiveXObject) {
  10. // code for IE6, IE5
  11. xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  12. }
  13. if (xmlHttp != null) {
  14. xmlHttp.open("GET", "/example/xml/note.xml", false);
  15. xmlHttp.send(null);
  16. xmlDoc = xmlHttp.responseText;
  17. xmlHttp.open("POST", "/example/xml/demo.aspx", false);
  18. xmlHttp.send(xmlDoc);
  19. document.write(xmlHttp.responseText);
  20. }
  21. else {
  22. alert("Your browser does not support XMLHTTP.");
  23. }
  24. </script>
  25. </body>
  26. </html>

ASP.Net 页面,由 C# 编写:

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. StringBuilder sb = new StringBuilder();
  4. using (System.IO.Stream stream = Request.InputStream)
  5. {
  6. // 以字符流的方式读取HTTP响应
  7. using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
  8. {
  9. string line = reader.ReadLine();
  10. while (line != null)
  11. {
  12. sb.AppendLine(line);
  13. line = reader.ReadLine();
  14. }
  15. reader.Close();
  16. stream.Close();
  17. }
  18. }
  19. string xml = sb.ToString();
  20. //载入xml文档
  21. XmlDocument xmlDocument = new XmlDocument();
  22. xmlDocument.LoadXml(xml);
  23. string name = "";
  24. //遍历xml节点
  25. foreach (XmlNode xmlNode in xmlDocument.DocumentElement.ChildNodes)
  26. {
  27. if (xmlNode.Name == "to") {
  28. name = xmlNode.InnerText;
  29. break;
  30. }
  31. }
  32. //输出 to 节点的内容
  33. Response.Write(name);
  34. }

通过使用 response.write 属性把结果传回客户端。


XMLHttpRequest 对象是 W3C 的标准吗?

任何 W3C 推荐标准均未规定 XMLHttpRequest 对象。

不过,W3C DOM Level 3 的 "Load and Save" 规范包含了一些相似的功能性,但是还没有任何浏览器实现它们。