赞
踩
这一技术能够向服务器请求额外的数据而无须卸载页面,会带来更好的用户体验。
Ajax这一技术的核心是XMLHttpRequest对象(简称XHR)
XHR为向服务器发送请求和解析服务器相应提供了流畅的接口。能够以异步方式从服务器取得更多信息,意味着用户单击后,可以不必刷新页面也能取得新数据。也就是说,可以使用XHR对象取得新数据,然后 再通过DOM将新数据插入到页面中。
虽然名字中包含XML的成分,但Ajax通信与数据格式无关;这种技术就是无需刷新即可从服务器取得数据,但不一定是XML数据。
浏览器差异导致在IE中可能会遇到三种不同版本的XHR对象
现在的浏览器大都支持原生的XHR对象
function createXHR(){
if(typeof XMLHttpRequest !="undefined"){
//创建XHR对象
return new XMLHttpRequest();
}
else if(typeof ActiveXObject!="undefined"){
//适用于IE7之前的版本
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=versions[i];
break;
}catch(ex){
//跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
else{
throw new Error("no xhr object available");
}
}

在使用XHR对象时,要调用的第一个方法是open(),它接受3个参数
xhr.open("get","example.php",false);
send()方法
只要上述属性的值发生改变,就会触发一次readystatechange事件。必须在调用open()之前指定onreadtstatechange事件处理程序才能确保跨浏览器兼容性。
上述事件处理程序,不建议使用this对象。如果使用,在有的浏览器中会导致函数执行失败,或者导致错误发生。因此,使用实际的xhr对象实例变量是较为可靠的一种方式。
在接收到响应之前还可以调用abort()方法来取消异步请求。之后xhr对象会停止触发事件,而且也不再允许访问任何与响应有关的对象属性。在终止请求之后,还应该对XHR对象进行解引用操作。且不建议重用xhr对象。
xhr.abort();
var xhr=createXHR();
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
if(xhr.status>=200&&xhr.status<300||xhr.status==304){
alert(xhr.reasponseText);
}
else{
alert("unsuccessful:"+xhr.status);
}
}
};
xhr.open("get","example.txt",true);
xhr.send(null);
每个HTTP请求和响应都会带有相应的头部信息。
默认情况下,在发送xhr请求的同时,还会发送下列头部信息:
使用setRequestHeader()方法,可以设置自定义的请求头部信息。两个参数
xhr.open("get","example.php","true");
xhr.setRequestHeader("MyHeader","MyValue");
xhr.send(null);
最常用于向服务器查询某些信息,可以将查询字符串参数追加到URL的末尾,以便将信息发送给服务器。
对XHR而言,位于传入open()方法的URL末尾的查询字符串必须经过正确的编码才行。
使用encodeURICompinent()进行编码,然后才能放到URL的末尾;而且所有名值对都必须由和号(&)分隔
var url="example.php";
function addURLParam(url,name,value){
url+=(url.indexOf("?")==-1?"?":"&");
url+=encodeURIComonent(name)+"="+encodeURIComponent(value);
return url;
}
//添加参数
url=addURLParam(url,"name","Mary");
//初始化请求
xhr.open("get",url,false);
通常用于向服务器发送应该被保存的数据。
POST请求的主题可以包含非常多的数据,而且格式不限。
第一步,初始化一个POST请求
xhr.open("post","example.php",true);
第二步,向send()方法中传入某些数据。可以传入XML DOM文档,传入的文档经序列化之后将作为请求主体被提交到服务器;也可以传入任何想发送到服务器的字符串
服务器对POST请求和提交web表单的请求不会一视同仁。因此,服务器端必须有程序来读取发送过来的原始数据。不过,可以使用XHR来模仿表单提交:
//把表单中的数据序列化之后发送给服务器
xhr.open("post","example.php",true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
var form=document.getElementById("user-info");
xhr.send(serialize(form));
FormData为序列化表单以及创建与表单格式相同的数据(用于通过xhr传输)提供了便利
创建后可以添加数据,通过append()方法:
通过向FormData构造函数中传入表单元素,也可以用表单元素的数据预先向其中填入键值对
var data=new FormData(document.forms[0]);
data.append("name","mary");
创建了实例后,可以将它直接传给XHR的send()方法
xhr.send(new FormData(form));
优点:不必设置请求头部,xhr对象能够识别传入的数据类型是FormData的实例,并配置适当的头部信息
timeout属性:在给其设置一个数值后,如果在规定的时间内浏览器还没有接收到响应,那么就会触发timeout事件,进而会调用ontimeout事件处理程序。仅适用于ie8+
xhr.open("get","timeout.php",true);
xhr.timeout(1000);//1秒钟
xhr.ontimeout=function(){
alert("request did not return in a second.");
};
xhr.send(null);
xhr.overrideMimeType("texe/xml");
在open()方法之前调用onprogress事件处理程序
xhr.onprogress=function(event){
var divstatus=document.getElementById("status");
if(event.lengthComputable){
divstatus.innerHTML="recived"+event.position+"of"+event.totalSize+"bytes";
}
};
xhr.open("get","example.php",true);
xhr.send(null);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。