XMLHttpRequest对象
我对XMLHttpRequest对象使用的理解:
1.创建:
var xhr=new XMLHttpRequest();
2.打开:
xhr.open("get","example.php",false);
open()接受三个参数:要发送的请求的类型(”get”、”post”等)、请求的URL和表示是否异步发送请求的布尔值。
这行代码会启动一个针对example.php的GET请求。有关这行代码,需要说明两点:一是URL相对于执行代码的当前页面(当然也可以使用绝对路径);二是调用open()并不会真正发送请求,而只是启动一个请求以备发送。
3.发送:
xhr.send(null);
这里的send()方法接收一个参数,即要作为请求主体发送的数据。如果不需要通过请求主体发送数据,则必须传入null,因为这个参数对有些浏览器来说是必需的。调用send()之后,请求就会被分派到服务器。
注意:
由于在IE7以前的版本中,可能会遇到三种不同版本的XHR对象,而IE7+、Firefox、Opera、Chrome和Safari都支持原生的XHR对象。所以可以使用下面的代码在所有浏览器中创建XHR对象:
function createXHR(){
if(typeof XMLHttpRequest !="undefined"){
return new XMLHttpRequest();
}else if(typeof ActiveXObject !="undefined"){
if(typeof arguments.callee.activeXString != "string"){
var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],i,len;
for(i=0,len=versions.length;i<len;i++){
try{
new ActiveXObject(versions[i]);
arguments.callee.activeXString=version[i];
break;
}catch (ex){
//跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else{
throw new Error("No XHR object avilable.");
}
}
如果open()中的第三个参数是false,也就是说如果请求是同步的,JavaScript代码会等到服务器响应之后再继续执行。在收到响应后,响应的数据就会自动填充XHR对象的属性,相关的属性简介如下:
- responseText: 作为响应主体被返回的文本。
- responseXML: 如果响应的内容类型是”text/xml”或”application/xml”,这个属性中将保存包含着响应数据的XML
- status: 响应的HTTP状态
- statusText: HTTP状态的说明
当发送异步请求时,可以检测XHR对象的readyState属性,该属性表示请求/响应过程的当前活动阶段。这个属性可取的值如下:
- 0:未初始化。尚未调用open()方法
- 1:启动。已经调用open()方法,但尚未调用send()方法。
- 2:发送。已经调用send()方法,但尚未接收到响应。
- 3:接收。已经接收到部分响应数据。
- 4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
var xhr=createXHR();
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
if((xhr.status>=200 && xhr.status<300)||xhr.status==304){
alert(xhr.responseText);
}else{
alert("Request was unsuccessful:"+xhr.status);
}
}
};
xhr.open("get","example.txt",true);
xhr.send(null);
另外,在接收到响应之前还可以调用abort()方法来取消异步请求,如下:
xhr.abort();
调用这个方法后,XHR对象会停止触发时间,而且也不再允许访问任何与响应有关的对象属性。在终止请求之后,还应该对XHR对象进行解引用操作。由于内存原因,不建议重用XHR对象。