[关闭]
@Dale-Lin 2019-08-19T11:34:51.000000Z 字数 3028 阅读 731

AJAX

web开发技术


Ajax 用于在不重新加载整个网页的情况下,对网页的某部分进行更新,核心是 XMLHttpRequest 对象。

XMLHttpRequest 对象

XMLHttpRequest 对象是 AJAX 的基础,用于在后台和服务器交换数据:

  1. var xmlhttp = new XMLHttpRequest();

使用 window.XMLHttpRequest() 创建 XMLHttpRequest 对象。


向服务器发送请求

使用 XMLHttpRequest 对象的 open(methodStr, urlStr, asyncBool)send() 方法发送请求到服务器:

  1. xmlhttp.open("GET", "/try/ajax/demo_get.php", true); //创建请求
  2. xmlhttp.send(); //发送请求
  1. open()
    • methodStr:请求的类型;"GET" / "POST"。
    • urlStr:请求路径。
    • asyncBool:是否使用异步。
  2. send()
    • 发送 http 请求。

可以使用 xmlhttp.setRequestHeader(header, value) 来设置 HTTP 头。

使用异步请求时,应规定响应处于 onreadystatechange 事件处理程序中的就绪状态时执行的函数:

  1. xmlhttp.onreadystatechange = function() {
  2. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  3. document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
  4. }
  5. };

服务器响应

如需获得来自服务器的响应,使用 XMLHttpRequest 对象的 responseTextresponseXML 属性。


onreadystatechange 事件

每当请求的 readyState 改变时,会触发该事件。
readyState 属性存有 XMLHttpRequest 对象的状态信息:

属性 描述
readyState 0:xhr 对象被创建,尚未调用 open 方法
1:调用了 open(),可以设置请求头部
2:send() 已调用,可以获得响应头
3:下载中,包含部分响应主体
4:请求已全部完成,且响应已就绪
status HTTP 状态码
  1. xmlhttp.onreadystatechange = function() {
  2. if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
  3. document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
  4. }
  5. };

实例

看一个向服务器发送查询请求的例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <script>
  6. function showHint(str)
  7. {
  8. var xmlhttp;
  9. if (str.length==0)
  10. {
  11. document.getElementById("txtHint").innerHTML="";
  12. return;
  13. }
  14. if (window.XMLHttpRequest)
  15. {
  16. // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
  17. xmlhttp=new XMLHttpRequest();
  18. }
  19. else
  20. {
  21. // IE6, IE5 浏览器执行代码
  22. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  23. }
  24. xmlhttp.onreadystatechange=function()
  25. {
  26. if (xmlhttp.readyState==4 && xmlhttp.status==200)
  27. {
  28. document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
  29. }
  30. }
  31. xmlhttp.open("GET","/try/ajax/gethint.php?q="+str,true);
  32. xmlhttp.send();
  33. }
  34. </script>
  35. </head>
  36. <body>
  37. <h3>在输入框中尝试输入字母 a:</h3>
  38. <form action="">
  39. 输入姓名: <input type="text" id="txt1" onkeyup="showHint(this.value)" />
  40. </form>
  41. <p>提示信息: <span id="txtHint"></span></p>
  42. </body>
  43. </html>

当用户在输入框中键入字符串时,会利用这个字符串来向服务器发送查询请求,然后将响应文本显示在另一个输入框内。

服务器端的数据可以用 ASP/PHP。

服务器也可以返回 XML 文件来被操作:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <style>
  6. table,th,td {
  7. border : 1px solid black;
  8. border-collapse: collapse;
  9. }
  10. th,td {
  11. padding: 5px;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <h1>XMLHttpRequest 对象</h1>
  17. <button type="button" onclick="loadXMLDoc()">获取我收藏的 CD</button>
  18. <br><br>
  19. <table id="demo"></table>
  20. <script>
  21. function loadXMLDoc() {
  22. var xhttp = new XMLHttpRequest();
  23. xhttp.onreadystatechange = function() {
  24. if (this.readyState == 4 && this.status == 200) {
  25. myFunction(this);
  26. }
  27. };
  28. xhttp.open("GET", "cd_catalog.xml", true);
  29. xhttp.send();
  30. }
  31. function myFunction(xml) {
  32. var i;
  33. var xmlDoc = xml.responseText;
  34. var table="<tr><th>Artist</th><th>Title</th></tr>";
  35. var x = xmlDoc.getElementsByTagName("CD");
  36. for (i = 0; i <x.length; i++) {
  37. table += "<tr><td>" +
  38. x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue +
  39. "</td><td>" +
  40. x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue +
  41. "</td></tr>";
  42. }
  43. document.getElementById("demo").innerHTML = table;
  44. }
  45. </script>
  46. </body>
  47. </html>

上例使用的服务器页面实际上是一个名为 cd_catalog.xml 的页面。


优点

缺点

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注