所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。
创建XMLHttpRequest 对象的语法:
variable=new XMLHttpRequest();
老版本的Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:
variable=new ActiveXObject("Microsoft.XMLHTTP");
为了应对所有的现代浏览器,包括IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject ::
实例
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"); }
XMLHttpRequest对象的属性
XMLHttpRequest对象的常见属性如下:
属性描述
onreadystatechange存储函数(或函数名),每当readyState的属性改变时,就会调用该函数。
readyState存有的XMLHttpRequest的状态从0到4发生变化。0:请求未初始化1:服务器连接已建立2:请求已接收3:请求处理中4:请求已完成,且响应已就绪
reponseText以文本形式返回响应。
responseXML以XML格式返回响应
status将状态返回为数字(例如,“Not Found”为404,“OK”为200)
statusText以字符串形式返回状态(例如,“Not Found”或“OK”)
XMLHttpRequest对象的方法
XMLHttpRequest对象的重要方法如下:
方法描述
abort()取消当前请求。
getAllResponseHeaders()以字符串形式返回完整的HTTP标头集。
getResponseHeader( headerName )返回指定HTTP标头的值。
void open(method,URL)打开指定获取或交的方法和URL的请求。
void open(method,URL,async)与上面相同,但指定异步或不。
void open(method,URL,async,userName,password)与上面相同,但指定用户名和密码。
void send(content)发送获取请求。
setRequestHeader( label,value)将标签/值对添加到要发送的HTTP标头。
向服务器发送请求
如需将请求发送到服务器,我们使用XMLHttpRequest 对象的open()和send()方法:
xmlhttp.open("GET","ajax_info.txt",true);
xmlhttp.send();
方法描述
open(method,url,async)规定请求的类型、URL 以及是否异步处理请求。
[if !supportLists]· [endif]
method:请求的类型;GET 或 POST
[if !supportLists]· [endif]
[if !supportLists]· [endif]
url:文件在服务器上的位置
[if !supportLists]· [endif]
[if !supportLists]· [endif]
async:true(异步)或 false(同步)
[if !supportLists]· [endif]
send(string)将请求发送到服务器。
[if !supportLists]· [endif]
string:仅用于 POST 请求
[if !supportLists]· [endif]
GET 还是 POST?
与POST相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用POST请求:
无法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST没有数据量限制)
发送包含未知字符的用户输入时,POST比GET更稳定也更可靠
GET 请求
一个简单的GET请求:
实例
xmlhttp.open("GET","demo_get.html",true);xmlhttp.send();
在上面的例子中,您可能得到的是缓存的结果。
为了避免这种情况,请向URL 添加一个唯一的 ID:
实例
xmlhttp.open("GET","demo_get.html?t=" + Math.random(),true);xmlhttp.send();
如果您希望通过GET方法发送信息,请向URL 添加信息:
实例
xmlhttp.open("GET","demo_get2.html?fname=Henry&lname=Ford",true);xmlhttp.send();
提示:GET请求具有以下的几个特点:
GET请求可被缓存
GET请求保留在浏览器历史记录中
GET请求可被收藏为书签
GET请求不应在处理敏感数据时使用
GET请求有长度限制
GET请求只应当用于取回数据
POST 请求
一个简单POST请求:
实例
xmlhttp.open("POST","demo_post.html",true);xmlhttp.send();
如果需要像HTML 表单那样 POST 数据,请使用setRequestHeader()来添加HTTP 头。然后在send()方法中规定您希望发送的数据:
实例
xmlhttp.open("POST","ajax_test.html",true);xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");xmlhttp.send("fname=Henry&lname=Ford");
方法描述
setRequestHeader(header,value)向请求添加 HTTP 头。
header: 规定头的名称
value: 规定头的值
提示:POST请求的特点如下:
POST请求不会被缓存
POST请求不会保留在浏览器历史记录中
POST请求不能被收藏为书签
POST请求对数据长度没有要求
url - 服务器上的文件
open()方法的url参数是服务器上文件的地址:
xmlhttp.open("GET","ajax_test.html",true);
该文件可以是任何类型的文件,比如.txt和.xml,或者服务器脚本文件,比如.asp和.php(在传回响应之前,能够在服务器上执行任务)。
异步- True 或 False?
AJAX 指的是异步JavaScript 和 XML(Asynchronous JavaScript and XML)。
XMLHttpRequest 对象如果要用于 AJAX 的话,其open()方法的sync参数必须设置为true:
xmlhttp.open("GET","ajax_test.html",true);
对于web 开发人员来说,发送异步请求是一个巨大的进步。很多在服务器执行的任务都相当费时。AJAX 出现之前,这可能会引起应用程序挂起或停止。
通过AJAX,JavaScript 无需等待服务器的响应,而是:
在等待服务器响应时执行其他脚本
当响应就绪后对响应进行处理
Async=true
当使用async=true 时,请规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:
实例
xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }xmlhttp.open("GET","ajax_info.txt",true);xmlhttp.send();
Async = false
如需使用async=false,请将open()方法中的第三个参数改为false:
xmlhttp.open("GET","test1.txt",false);
我们不推荐使用async=false,但是对于一些小型的请求,也是可以的。
请记住,JavaScript 会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止。
注意:当您使用async=false 时,请不要编写 onreadystatechange 函数 - 把代码放到send()语句后面即可:
实例
xmlhttp.open("GET","ajax_info.txt",false);xmlhttp.send();document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
XHR 响应
AJAX - 服务器响应
由于HTTP 响应是由服务端发出的,并且服务器做出响应需要时间(比如网速慢等原因),所以我们需要监听服务器响应的状态,然后才能进行处理。
状态行xhr.status状态码,如200,304,404等;
响应主体xhr.responseText与xhr.responseXML都表示响应主体。
如需获得来自服务器的响应,请使用XMLHttpRequest 对象的responseText或responseXML属性。
属性描述
responseText获得字符串形式的响应数据。
responseXML获得 XML 形式的响应数据。
responseText 属性
如果来自服务器的响应并非XML,请使用responseText属性。
responseText属性返回字符串形式的响应,因此您可以这样使用:
实例
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
responseXML 属性
如果来自服务器的响应是XML,而且需要作为 XML 对象进行解析,请使用responseXML属性:
实例
请求cd_catalog.xml 文件,并解析响应:
xmlDoc=xmlhttp.responseXML;txt="";x=xmlDoc.getElementsByTagName("ARTIST");for (i=0;i<x.length;i++) { txt=txt + x[i].childNodes[0].nodeValue + "<br>"; }document.getElementById("myDiv").innerHTML=txt;
XHR readyState
AJAX - onreadystatechange 事件
当发送一个请求后,客户端需要确定这个请求什么时候会完成,因此,XMLHttpRequest对象提供了onreadystatechange事件机制来捕获请求的状态,继而实现响应。
当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当readyState改变时,就会触发onreadystatechange事件。
readyState属性存有XMLHttpRequest 的状态信息。
下面是XMLHttpRequest 对象的三个重要的属性:
属性描述
onreadystatechange存储函数(或函数名),每当readyState属性改变时,就会调用该函数。
readyState存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪
status200: "OK"404: 未找到页面
readyState状态说明
0:请求未初始化
此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备,值为0表示对象已经存在,否则浏览器会报错:对象不存在。
1:服务器连接已建立
此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。
值为1表示正在向服务端发送请求。
2:请求已接收
此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。
值为2表示已经接收完全部响应数据,并为下一阶段对数据解析作好准备。
3:请求处理中
此阶段解析接收到的服务器端响应数据即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody,responseText或responseXML的属性存取的格式,为在客户端调用作好准备。
状态3表示正在解析数据。
4:请求已完成,且响应已就绪
此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过的XMLHttpRequest对象的属性取得数据。
概而括之,整个XMLHttpRequest对象的生命周期应该包含如下阶段:
1.创建2.初始化请求3.发送请求4.接收数据5.解析数据6.完成
在onreadystatechange事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。
当readyState等于4 且状态为 200 时,表示响应已就绪:
实例
xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }
在onreadystatechange事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。
当readyState等于4 且状态为 200 时,表示响应已就绪:
实例
xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }
使用回调函数
回调函数是一种以参数形式传递给另一个函数的函数。
如果您的网站上存在多个AJAX 任务,那么您应该为创建 XMLHttpRequest 对象编写一个标准的函数,并为每个AJAX 任务调用该函数。
该函数调用应该包含URL 以及发生onreadystatechange事件时执行的任务(每次调用可能不尽相同):
实例
function myFunction(){loadXMLDoc("ajax_info.txt",function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } });}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
var xmlhttp;
function loadXMLDoc(url,cfunc)
{
if (window.XMLHttpRequest)
{// IE7+, Firefox, Chrome, Opera, Safari 代码
xmlhttp=new XMLHttpRequest();
}
else
{// IE6, IE5 代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
function myFunction()
{
loadXMLDoc("/statics/demosource/ajax_info.txt",function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
});
}
</script>
</head>
<body>
<div id="myDiv"><h2>使用 AJAX 修改文本内容</h2></div>
<button type="button" onclick="myFunction()">修改内容</button>
</body>
</html>