基本介绍
asynchronous JavaScript and XML
并非编程语言,而是组合了浏览器内建的 XMLHttpRequest 对象和 JavaScript 和 HTMLDOM 对象,使得通过场景后页面的 web 服务器数据来异步更新网页。
功能
- 不刷新页面而更新网页
 - 在页面加载后从服务器请求数据
 - 在页面加载后从服务器接收数据
 - 在后台想服务器发送数据 ```javascript <!DOCTYPE html>
 
XMLHttpRequest 对象
<a name="E03aB"></a># XMLHttpRequest 对象Ajax 核心是XMLHttpRequest 对象,后者用于同服务器交换数据,- 创建XMLHttpRequest 对象```javascript<!DOCTYPE html><html><body><h1>XMLHttpRequest 对象</h1><p id="demo">让 AJAX 改变这段文本。</p><button type="button" onclick="loadDoc()">更改内容</button><script>function loadDoc() {var xhttp = new XMLHttpRequest();xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {document.getElementById("demo").innerHTML = this.responseText;}};xhttp.open("GET", "/example/js/ajax_info.txt", true);xhttp.send();}</script>
XMLHttpRequest 跨域访问
<!DOCTYPE html><html><body><h1>XMLHttpRequest 对象</h1><p id="demo">让 AJAX 改变这段文本。</p><button type="button" onclick="loadDoc()">更改内容</button><script>function loadDoc() {var xhttp;if (window.XMLHttpRequest) {// 针对现代浏览器的代码xhttp = new XMLHttpRequest();} else {// 针对 IE6、IE5 的代码xhttp = new ActiveXObject("Microsoft.XMLHTTP");}xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {document.getElementById("demo").innerHTML = this.responseText;}};xhttp.open("GET", "/example/js/ajax_info.txt", true);xhttp.send();}</script></body></html>
XMLHttpRequest 对象属性
- onreadystatechange
- 定义当 readystate 属性发生变化时被调用的函数
 
 - readyState
- 保存XMLHttpRequest 的状态
- 0:请求未初始化
 - 1:服务器连接已经建立
 - 2: 请求已收到
 - 3:正在处理请求
 - 4: 请求完成且相应已就绪
 
 
 - 保存XMLHttpRequest 的状态
 - responseText
- 以字符串返回相应数据
 
 - responseXML
- 以 XML 数据返回相应数据
 
 - status
- 返回请求状态号
- 200:OK
 - 403:forbidden
 - 404:notfound
 
 
 - 返回请求状态号
 statusText
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 更简单和快速,用于大多数情况下,
- 以下情况用于 post
- 缓存文件不是选项(更新服务器上的文件或数据库)
 - 向服务器发送大量数据
 - 发送用户输入(可包含位置字符)post 比 get 更加安全
 
 
post 请求
<!DOCTYPE html><html><body><h1>XMLHttpRequest 对象</h1><button type="button" onclick="loadDoc()">请求数据</button><p id="demo"></p><script>function loadDoc() {var xhttp = new XMLHttpRequest();xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {document.getElementById("demo").innerHTML = this.responseText;}};xhttp.open("POST", "/demo/demo_post.asp", true);xhttp.send();}</script>
onreadystatechange 属性
<!DOCTYPE html><html><body><div id="demo"><h1>XMLHttpRequest 对象</h1><button type="button" onclick="loadDoc()">更改内容</button></div><script>function loadDoc() {var xhttp = new XMLHttpRequest();xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {document.getElementById("demo").innerHTML =this.responseText;}};xhttp.open("GET", "/example/js/ajax_info.txt", true);xhttp.send();}</script>
使用回调函数
- 回调函数是哟中作为参数被传递到另一个函数的函数
 - 如果网站中有多个ajax 任务,那么应该创建一个执行 XMLHttpRquest 对象的函数,一个一个供每个 ajax 任务的回调函数
 - 该函数应当包含 url 以及当相应就绪时调用的函数 ```javascript <!DOCTYPE html>
 
XMLHttpRequest 对象
```javascript<!DOCTYPE html><html><body><h1>XMLHttpRequest 对象</h1><h2>请在下面的输入字段中键入字母 A-Z:</h2><p>搜索建议:<span id="txtHint"></span></p><p>姓名:<input type="text" id="txt1" onkeyup="showHint(this.value)"></p><script>function showHint(str) {var xhttp;if (str.length == 0) {document.getElementById("txtHint").innerHTML = "";return;}xhttp = new XMLHttpRequest();xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {document.getElementById("txtHint").innerHTML = this.responseText;}};xhttp.open("GET", "/demo/gethint.php?q="+str, true);xhttp.send();}
<!DOCTYPE html><html><style>table,th,td {border : 1px solid black;border-collapse: collapse;}th,td {padding: 5px;}</style><body><p>请点击某个曲目,可显示专辑信息。</p><p id='showMUSIC'></p><table id="demo"></table><script>var x,xmlhttp,xmlDocxmlhttp = new XMLHttpRequest();xmlhttp.open("GET", "/demo/music_list.xml", false);xmlhttp.send();xmlDoc = xmlhttp.responseXML;x = xmlDoc.getElementsByTagName("TRACK");table="<tr><th>艺术家</th><th>曲目</th></tr>";for (i = 0; i <x.length; i++) {table += "<tr onclick='displayMUSIC(" + i + ")'><td>";table += x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue;table += "</td><td>";table += x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue;table += "</td></tr>";}document.getElementById("demo").innerHTML = table;function displayMUSIC(i) {document.getElementById("showMUSIC").innerHTML ="<ul>" +"<li>曲目:" +x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue + "</li>" +"<li>艺术家:" +x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue + "</li>" +"<li>专辑:" +x[i].getElementsByTagName("ALBUM")[0].childNodes[0].nodeValue + "</li>" +"<li>国家:" +x[i].getElementsByTagName("COUNTRY")[0].childNodes[0].nodeValue + "</li>" +"<li>公司:" +x[i].getElementsByTagName("COMPANY")[0].childNodes[0].nodeValue + "</li>" +"<li>年份:" +x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue + "</li>" +"</ul>";}</script></body></html>
