基本介绍

asynchronous JavaScript and XML
并非编程语言,而是组合了浏览器内建的 XMLHttpRequest 对象和 JavaScript 和 HTMLDOM 对象,使得通过场景后页面的 web 服务器数据来异步更新网页。
功能

  • 不刷新页面而更新网页
  • 在页面加载后从服务器请求数据
  • 在页面加载后从服务器接收数据
  • 在后台想服务器发送数据 ```javascript <!DOCTYPE html>

XMLHttpRequest 对象

  1. <a name="E03aB"></a>
  2. # XMLHttpRequest 对象
  3. Ajax 核心是XMLHttpRequest 对象,后者用于同服务器交换数据,
  4. - 创建XMLHttpRequest 对象
  5. ```javascript
  6. <!DOCTYPE html>
  7. <html>
  8. <body>
  9. <h1>XMLHttpRequest 对象</h1>
  10. <p id="demo">让 AJAX 改变这段文本。</p>
  11. <button type="button" onclick="loadDoc()">更改内容</button>
  12. <script>
  13. function loadDoc() {
  14. var xhttp = new XMLHttpRequest();
  15. xhttp.onreadystatechange = function() {
  16. if (this.readyState == 4 && this.status == 200) {
  17. document.getElementById("demo").innerHTML = this.responseText;
  18. }
  19. };
  20. xhttp.open("GET", "/example/js/ajax_info.txt", true);
  21. xhttp.send();
  22. }
  23. </script>

XMLHttpRequest 跨域访问

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>XMLHttpRequest 对象</h1>
  5. <p id="demo">让 AJAX 改变这段文本。</p>
  6. <button type="button" onclick="loadDoc()">更改内容</button>
  7. <script>
  8. function loadDoc() {
  9. var xhttp;
  10. if (window.XMLHttpRequest) {
  11. // 针对现代浏览器的代码
  12. xhttp = new XMLHttpRequest();
  13. } else {
  14. // 针对 IE6、IE5 的代码
  15. xhttp = new ActiveXObject("Microsoft.XMLHTTP");
  16. }
  17. xhttp.onreadystatechange = function() {
  18. if (this.readyState == 4 && this.status == 200) {
  19. document.getElementById("demo").innerHTML = this.responseText;
  20. }
  21. };
  22. xhttp.open("GET", "/example/js/ajax_info.txt", true);
  23. xhttp.send();
  24. }
  25. </script>
  26. </body>
  27. </html>

XMLHttpRequest 对象属性

  • onreadystatechange
    • 定义当 readystate 属性发生变化时被调用的函数
  • readyState
    • 保存XMLHttpRequest 的状态
      • 0:请求未初始化
      • 1:服务器连接已经建立
      • 2: 请求已收到
      • 3:正在处理请求
      • 4: 请求完成且相应已就绪
  • responseText
    • 以字符串返回相应数据
  • responseXML
    • 以 XML 数据返回相应数据
  • status
    • 返回请求状态号
      • 200:OK
      • 403:forbidden
      • 404:notfound
  • statusText

    • 返回状态文本(如 OK、NotFound)

      XMLHttpRequest 对象方法

  • new XMLHttpRequest()

    • 创建新的 XMLHttpRequest 对象
  • abort()
    • 取消当前请求
  • getAllResponseHeader()
    • 返回头部消息
  • getResponseHeader()
    • 返回特定的头部信息
  • open(method,url,async,user,psw)
    • 规定请求
      • method:请求类型 get或者post
      • url:文件位置
      • async:true 异步、false 同步
      • user:可选的用户名称
      • psw:可选的密码
  • send()
    • 将请求发送到服务器,用于 get 请求
  • send(string)
    • 将请求发送到服务,用于post 请求
  • setResponseHeader()

    • 向要发送的报头添加标签\值对

      get 和 post 区别

  • get 比 post 更简单和快速,用于大多数情况下,

  • 以下情况用于 post
    • 缓存文件不是选项(更新服务器上的文件或数据库)
    • 向服务器发送大量数据
    • 发送用户输入(可包含位置字符)post 比 get 更加安全

post 请求

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>XMLHttpRequest 对象</h1>
  5. <button type="button" onclick="loadDoc()">请求数据</button>
  6. <p id="demo"></p>
  7. <script>
  8. function loadDoc() {
  9. var xhttp = new XMLHttpRequest();
  10. xhttp.onreadystatechange = function() {
  11. if (this.readyState == 4 && this.status == 200) {
  12. document.getElementById("demo").innerHTML = this.responseText;
  13. }
  14. };
  15. xhttp.open("POST", "/demo/demo_post.asp", true);
  16. xhttp.send();
  17. }
  18. </script>

onreadystatechange 属性

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <div id="demo">
  5. <h1>XMLHttpRequest 对象</h1>
  6. <button type="button" onclick="loadDoc()">更改内容</button>
  7. </div>
  8. <script>
  9. function loadDoc() {
  10. var xhttp = new XMLHttpRequest();
  11. xhttp.onreadystatechange = function() {
  12. if (this.readyState == 4 && this.status == 200) {
  13. document.getElementById("demo").innerHTML =
  14. this.responseText;
  15. }
  16. };
  17. xhttp.open("GET", "/example/js/ajax_info.txt", true);
  18. xhttp.send();
  19. }
  20. </script>

使用回调函数

  • 回调函数是哟中作为参数被传递到另一个函数的函数
  • 如果网站中有多个ajax 任务,那么应该创建一个执行 XMLHttpRquest 对象的函数,一个一个供每个 ajax 任务的回调函数
  • 该函数应当包含 url 以及当相应就绪时调用的函数 ```javascript <!DOCTYPE html>

XMLHttpRequest 对象

``` ## 实例 ```javascript

  1. ```javascript
  2. <!DOCTYPE html>
  3. <html>
  4. <body>
  5. <h1>XMLHttpRequest 对象</h1>
  6. <h2>请在下面的输入字段中键入字母 A-Z:</h2>
  7. <p>搜索建议:<span id="txtHint"></span></p>
  8. <p>姓名:<input type="text" id="txt1" onkeyup="showHint(this.value)"></p>
  9. <script>
  10. function showHint(str) {
  11. var xhttp;
  12. if (str.length == 0) {
  13. document.getElementById("txtHint").innerHTML = "";
  14. return;
  15. }
  16. xhttp = new XMLHttpRequest();
  17. xhttp.onreadystatechange = function() {
  18. if (this.readyState == 4 && this.status == 200) {
  19. document.getElementById("txtHint").innerHTML = this.responseText;
  20. }
  21. };
  22. xhttp.open("GET", "/demo/gethint.php?q="+str, true);
  23. xhttp.send();
  24. }
  1. <!DOCTYPE html>
  2. <html>
  3. <style>
  4. table,th,td {
  5. border : 1px solid black;
  6. border-collapse: collapse;
  7. }
  8. th,td {
  9. padding: 5px;
  10. }
  11. </style>
  12. <body>
  13. <p>请点击某个曲目,可显示专辑信息。</p>
  14. <p id='showMUSIC'></p>
  15. <table id="demo"></table>
  16. <script>
  17. var x,xmlhttp,xmlDoc
  18. xmlhttp = new XMLHttpRequest();
  19. xmlhttp.open("GET", "/demo/music_list.xml", false);
  20. xmlhttp.send();
  21. xmlDoc = xmlhttp.responseXML;
  22. x = xmlDoc.getElementsByTagName("TRACK");
  23. table="<tr><th>艺术家</th><th>曲目</th></tr>";
  24. for (i = 0; i <x.length; i++) {
  25. table += "<tr onclick='displayMUSIC(" + i + ")'><td>";
  26. table += x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue;
  27. table += "</td><td>";
  28. table += x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue;
  29. table += "</td></tr>";
  30. }
  31. document.getElementById("demo").innerHTML = table;
  32. function displayMUSIC(i) {
  33. document.getElementById("showMUSIC").innerHTML =
  34. "<ul>" +
  35. "<li>曲目:" +
  36. x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue + "</li>" +
  37. "<li>艺术家:" +
  38. x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue + "</li>" +
  39. "<li>专辑:" +
  40. x[i].getElementsByTagName("ALBUM")[0].childNodes[0].nodeValue + "</li>" +
  41. "<li>国家:" +
  42. x[i].getElementsByTagName("COUNTRY")[0].childNodes[0].nodeValue + "</li>" +
  43. "<li>公司:" +
  44. x[i].getElementsByTagName("COMPANY")[0].childNodes[0].nodeValue + "</li>" +
  45. "<li>年份:" +
  46. x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue + "</li>" +
  47. "</ul>";
  48. }
  49. </script>
  50. </body>
  51. </html>