AJAX(Asynchronous JavaScript And XML):异步的JavaScript 和 XML
AJAX是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。
XMLHttpRequest
XMLHttpRequest是AJAX的基础。对象用于和服务器交换数据。
所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。
创建XMLHttpRequest对象的语法:variable = new XMLHttpRequest();
老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:
variable = new ActiveXObject("Microsoft.XMLHTTP");
发送请求
如需将请求发送到服务器,需要使用XMLHttpRequest对象的open() 和 send()方法:
open():xmlhttp.open(method,url,async);
参数:method的请求类型GET或POST,url:文件在服务器上的位置,async:true异步或false同步
send():xmlhttp.send();
参数:send(string):将请求发送到服务器,string仅用于POST请求。
Async=true
当使用 async=true时,规定在响应处于onreadystatechange事件中的就绪状态时执行的函数:
xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","test1.txt",true); xmlhttp.send();
onreadystatechange事件
当请求被发送到服务器时,我们需要执行一些基于响应的任务
每当readyState改变时,就会触发onreadystatechange事件
readyState属性存有XMLHttpRequest对象的状态信息
readyState属性状态: 0 ~ 4
-
0:请求未初始化
-
1:服务器连接已建立
-
2:请求已接收
-
3:请求处理中
-
4:请求已完成,且响应已就绪
status属性: 200-->“OK”,404-->Not Found
在onreadystatechange事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务
当readyState 为 4 且状态为 200 时,表示响应已就绪:
xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){
document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }
注:onreadystatechange事件被触发5次(0~4),对应着每个readyState的变化
服务器响应
如需获得来自服务器的响应,需使用XMLHttpRequest对象的responseText 或 responseXML属性
xmlhttp.responseText:获取字符串形式的响应数据
xmlhttp.responseXML:获得XML形式的响应数据
GET与POST
与POST请求相比,GET更简单也更快,并且大部分情况下都能用。
然而,在以下情况中,使用POST请求:
-
无法使用缓存文件(更新服务器上的文件或数据库)
-
向服务器发送大量数据(POST没有数据量限制)
-
发送包含未知字符的用户输入时,POST比GET更稳定也更可靠
设置请求头
xmlhttp.setRequestHeader(header,value);----POST请求需要设置
参数:header:http协议中规定的头的名称。value:为规定相应头的值。
例:xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded")
代码示例:
GET
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title></title> <script type="text/javascript"> function loadXMLDoc() { var xmlhttp; if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { document.getElementById("myDiv").innerHTML = xmlhttp.responseText; } } xmlhttp.open("GET", "url", true); //ajax不能跨域请求数据 xmlhttp.send(); } </script> </head> <body> <h2>AJAX</h2> <button type="button" onclick="loadXMLDoc()">请求数据</button> <div id="myDiv"></div> </body> </html>
POST
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript"> function loadXMLDoc() { var xmlhttp; if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { document.getElementById("myDiv").innerHTML = xmlhttp.responseText; } } xmlhttp.open("POST", "url", true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.send("fname=Bill&lname=Gates"); } </script> </head> <body> <h2>AJAX</h2> <button type="button" onclick="loadXMLDoc()">请求数据</button> <div id="myDiv"></div> </body> </html>