读Brett McLaughlin的掌握AJAX系列---第 3 部分: Ajax 中的高级请求和响应
Posted on 2006-11-07 14:52 舞步者 阅读(121) 评论(0) 收藏 举报在创建XMLHttpRequest对象时,微软使用xmlhttp的对象,而不是XMLHTTPREQUEST,而Mozilla,opera,Safari和大部分非Microsoft浏览器都使用的是后者。为简单起见,统一称为XMLHTTPREQUEST
1.深入理解HTTP就绪状态
HTTP状态有五种:0--未初始化,1--初始化,2--加载中,3--加载完毕,4--完成
readyState=0代表未初始化,一旦调用open()方法,这个属性被设置为1;通常在对请求初始化完毕后,立即调用open()方法,所以很少看到0这种状态;另外未初始化这种状态在实际应用中是没有真正用处的。
function getdata()
{
createRequest();
alert("ready state is"+reqeust.readyState);
var url="/boards/servlet/UpdateBoardSales";
request.open("GET",url,true);
request.onreadystatechange=updatePage;
request.send(null);
}
这种状态的唯一用法是:使用相同的XMLHTTPREQUEST对象在不同的函数之间生成多个请求,我们可能希望在生成新请求前确保请求对象是处于未初始化状态,这也就是说要确保另一个函数没有同时使用这个对象。
function updatePage()
{
alert("updataePage() called with ready state of "+request.readyState);
}
onreadystatechange属性设置当每次请求状态改变时,会回调updatePage这个函数,此函数会报告请求对象的状态;这个回调函数在运行期间会运行多次,我们可以看到每个就绪状态的报告,这是跟踪请求所经历的各个阶段的最好方法;
但是不是每种浏览器都会报告这五种状态,如Opera 8.5 只会报告3,4两种;safari2.01会报告2,3,4状态
2.获取安全数据
应该强调,只有在就绪状态为4的情况下数据才可以安全使用;但是,当就绪状态为3时,从responseText中也能获取数据,然而这不是什么好的主意,一旦编写了依赖于就绪状态为3的完整数据的代码,几乎就要自己来负责当时的数据不完整的问题了。
这里举个进度条的例子,我们可能做个进度显示条,就绪状态为1时为25%,2时50%,3时75%,4时100%,这个主意是不错,但依赖于浏览器的,在OPERA上,您永远看不到前两个就绪状态,这个在上文已经有说明
3. 理解HTTP的状态代码
光判断HTTP的就绪状态为4还是不够的,虽然HTTP就绪状态为完成,但不代表用户会获得预期的数据,服务器可能返回的是错误的信息,为此,还应该判断HTTP的状态代码,只有状态代码为200时,才代表返回一切正常。
常见的错误处理代码:
function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var response = request.responseText.split("|");
document.getElementById("order").value = response[0];
document.getElementById("address").innerHTML =
response[1].replace(/\n/g, "<br />");
} else if (request.status == 404) {
alert ("Requested URL is not found.");
} else if (request.status == 403) {
alert("Access denied.");
} else
alert("status is " + request.status);
}
}
4.其他的请求类型--HEAD
function getdata()
{
createrequest();
var url="/boards/servlet/UpdateBoardSales";
request.open("HEAD",url,true);
request.onreadystatechange=updatedata;
request.send(null);
}
当成一个HEAD请求时,服务器不会象GET或POST请求一样返回一个真正的响应,只会返回资源的头,包括
响应中内容的最后修改时间,资源是否存在以及其他有用的信息,我们可以在服务器处理并返回资源之前使用这些技术来了解下资源的相关信息
代码:输出从 HEAD 请求中获得的响应头的内容
function updatedata()
{
if(request.readystate==4)
{
alert(request.getAllResponseHeaders());
}
}
HEAD请求非常有用的一个领域是查看内容的长度和类型,这样可以确定服务器是否要发回大量数据来处理请求,以及服务器是否试图发回二进制数据;因此在这里情况下,要获取响应的长度,可以使用response.getResponseHeader("Content-Length");要获取内容,可以用response.getResponseHeader("Content-Type")。
浙公网安备 33010602011771号