Ajax应用程序可以用javascript脚本代码创建
主要步骤如下
(1) 调用XMLHttpRequest对象的open()方法,设置所有的请求方法,请求资源的URL, 并指定采用同步或异步方式发送HTTP请求。
(2) 设置XMLHttpRequest对象的onreadystatechange属性,以指定当请求状态改变时调用的时间处理程序
(3) 调用XMLHttpRequest对象的sendf方法,向服务器发送请求并接受响应。在服务器段接收请求和发送请求时可以使用各种编程语言实现: asp、jsp、php、asp.net.......
(4) 在事件处理程序中,对从服务器获取的HTTP代码块、XML数据、json数据或其他数据进行解析和处理,然后插入到HTTP文档中,以实现页面的局部更新。
如果在调用open和send方法时都没有传入任何请求参数,则这种请求也成为简单请求。简单请求通常用在自动刷新的场合,用于从服务器端获取公告性质的响应。例如股票行情等实时信息。由于发送简单请求时不需要向服务器传递请求参数,所以使用POST或GET方法都是可以的。
发送GET请求时,可将open()方法的第一个参数设置为GET,若要向服务器端发送请求参数,应在调用open方法时把名称/值附加在第2个参数(服务器资源URL)的后面。但由于URL的长度是有限的,所以不能通过GET请求来发送大量数据,如果数据量太大,数据可能被截断,将无法得到预期的处理结果,在这种情况下,可以改用POST方法发送异步请求。
同时浏览器会缓存HTTP GET请求的结果。如果要保证不缓存结果,可以在客户端或者服务器端禁止页面缓存。
~ 若要在客户端禁止页面缓存,可以在ajax请求的后台数据处理页面的URL上附加一个随机字符串。所用javascript代码如下,加之后ajax每次发出的URL都不同,因此浏览器会认为ajax每次发出的HTTP请求也是各不相同的,从而每次都会重新请求。
xhr.open("GET","test.jsp?name=span&time=" + new Date().getTime(),true);
XMLHttpRequest对象的属性和方法
1. readyState属性
返回XMLHttpRequest对象所处的状态。[nState = ]xhr.readyState;
readyState属性是一个只读属性,没有默认值。属性值可以为下列整数之一
- 0:表示未初始化状态(Uninitialized),以创建XMLHttpRequest对象,但尚未进行初始化(即未调用open方法)
- 1:表示准备发送(Open),已调用XMLHttpRequest对象的open()方法,发送到服务器段的请求准备就绪。
- 2:表示已发送状态(Sent),已调用XMLHttpRequest对象的send方法,但是状态和表头仍然不可用。
- 3:表示正在接收状态(Receiving),已收到HTTP响应标头,但尚未完全接收到响应的正文。
- 4:表示完成响应状态(Loaded),所有数据均已收到,并且可用。
2. onreadystatechange属性
可读写属性,没有默认值,可将其设置为一个已经定义的JavaScript命名函数的的名称和匿名函数。
无论readyState值何时发生改变,XMLHttpRequest对象都会触发一个readysatechange事件。onreadystatechange属性用于设置异步请求的事件处理程序
xhr.onreadystatechange [= vCallback];
3. responseText属性
只读属性,没有默认值。只有readyState属性值为4时,才能通过该属性获取完整的响应信息
返回客户端接收到的HTTP响应的文本内容。
[sBody = ]xhr.responseText;
4. responseXML属性
只读属性,没有默认值。只有readyState属性值为4时,并且Content-Type响应标头的MIME属性为text/xml 或application/xml时,该属性才会有值,并被解析为一个XML文档。
返回服务器响应的XML文档对象
[oXMLdOCUMENT = ]xhr.responseXML;
5. status属性
只读属性,没有默认值。只有当readyState属性值为3或者4时,才能读取status属性;只有当status属性值为200时,才能访问responseText和responseXML属性。
返回请求的HTTP状态码。
[nStatus = ]xhr.status; nStatus为一个整形变量,可接受HTTP状态码,例如
~ 200:表示服务器响应正常
~ 401:表示访问被拒绝
~ 404:表示所请求的资源不存在
~ 500: 表示服务器内部错误
6. statusText属性
只读属性,没有默认值。只有当服务器响应已经完成时,才能有该状态文本信息。返回HTTP请求的状态文本
[sStatus = ]xhr.statusText;
7. open方法
用于初始化请求参数,挤兑一个挂起的请求设置请求方法、目标URL以及其他可选属性
xhr.open(sMethod, sUrl[, bAsync][, sUser][, sPassword]);
- sMethod参数: 必选项,其值是一个字符串,指定打开连接苏勇的HTTP方法,例如GET,POST或HEAD
- sUrl参数:必选项,值是一个字符串,指定请求的绝对或相对URL,该地址会被自动解析为绝对地址。当使用GET方法发送请求时,可以将请求参数附加在该参数之后,URL与参数之间用问好(?)分隔,参数名与参数值之间使用等号(=)连接,不同名称/值对之间使用符号&连接,例如test.jsp?name1=value1&name2=value2.
- bAsync参数:可选项, 值为boolean值 true或false。
~ 如果值为true,则为异步操作,调用send方法立即返回,脚本继续执行,无需等待响应;
~ 如果值为false,则在接受响应之前,脚本停止执行,并且冻结页面的功能;
~ 如果未提供该参数,则默认值为true。
- sUser:可选项,指定进行身份验证的用户名。如果该参数为空(""),或者该参数为填但站点要求进行身份验证,则显示一个登陆窗口。
- sPassword是可选项,指定进行身份验证的密码。
8. send方法
向服务器发送HTTP请求并接收响应。
xhr.send([varBody]);
参数varBody为可选项,可以是String类型值、无符号字节数组,也可以是一个XML DOM对象。指定随请求发送的消息正文。send方法没有返回值。
调用send()方法是同步还是异步,取决于open()方法时参数bAsync的值:
~ 如果采用同步方式,则次调用不会返回,直到接收到整个响应或协议堆栈超时时间到期。
~ 如果采用异步方式,则次调用立即返回。
使用GET方法向服务器发送请求时,请求参数可以附加在URL后面,但在调用send方法时,还是应该传递一个参数,此时使用null作为参数即可。如果直接使用无参数的send方法,在IE中可以正常运行,在Firefox里不能正常运行。
9. abort方法
没有返回值,取消当前HTTP请求,中止一个在进行中的操作。
xhr.abort();
通过在open方法中将true传递给bAsync参数可以创建一个异步请求。调用abort方法将重置XMLHttpRequest对象,删除其onreadystatechange时间处理程序,并将readyState属性值设置为0(未初始化)。
10. setRequestHeader方法
将自定义的HTTP标头添加到请求中
xhr.setRequestHeader(sName, sValue);
2个参数都是必选项,分别制定标头的名称和值。当readyState属性值为1时,可以调用setRequestHeader方法,该方法没有返回值。
11. getAllResponseHeaders方法
返回响应标头的完整列表。
sHeader s = xhr.getAllResponseHeaders();
该方法返回一个字符串,包含全部响应标头。每个名称/值对由回车符/换行符序列(CR/LF)分隔。
12. getResponseHeader方法
返回指定的响应标头。
p = xhr.getResponseHeader(bstrHeader);
其中bstrHeader是必选的一个字符串,用于指定响应标头的名称。返回值是一个字符串,包含响应标头的值。
下面用一个例子说明如何通过XMLHttpRequest对象实现Ajax交互。
test.html__________________
<span>你好,Ajax! </span>
ajaxDemo1.html____________
<html>
<head>
<title>Ajax应用实例</title>
<style type="text/css">
p, button, li {font-size: 12px; color:green}
span{font-size="22px; font-style:itatlic; font-weight:bold; color: red; width:145px; background-color:yellow; display:block; position:relative"}
</style>
<script type="text/javascript" src="../scripts/jquery-1.4.2.js"> </script>
<script type="text/javascript" src="../scripts/ajax.js"> </script>
<script type="text/javascript">
var xhr;
function callback() {
var states = ["正在初始化......”, "正在初始化请求......", "正在发送请求......", "正在接收数据.....", "正在解析数据......"];
$("ol").append("<li>" + states[xhr.readyState] + "</li>");
$("li:last").append("完成!");
if(xhr.readyState == 4 && xhr.status ==200) {
var sHeaders = xhr.getAllResponseHeaders();
var sResponse = xhr.responseText;
$("p:first").html("<b>响应标头:</b>" + sHeaders);
$("p:last").html("<b>服务器响应文本:</b>" + sResponse);
$("span").hide().fadeIn(2000).animate({left:"+=168"},2000).animate({top:"-=16",fontSize:"22px"},1000);
}
}
$(document).ready(function(){
$("button").click(
xhr = createXMLHttpReq();
if(xhr){
try{
xhr.open("GET", "test.html",true);
xhr.onreadystatechange = callback;
xhr.send(null);
}catch(oErr){
alert("无法连接服务器:" + oErr.toString());
}
}
);
});
</script>
</head>
<body>
<button>发送请求</button>
<ol></ol>
<p></p>
<p></p>
</body>
</html>
——————————————————————————————————