实例讲解使用原生JavaScript处理AJAX请求的方法
Ajax是异步的JavaScript和XML的简称,是一种更新页面某部分的机制。它赋予了你从服务器获取数据后,更新页面某部分的权力,从而避免了刷新整个页面。另外,以此方式实现页面局部更新,不仅能有效地打造流畅的用户体验,而且减轻了服务器的负载。
下面是对一个基本的Ajax请求进行剖析:
varxhr=newXMLHttpRequest();
xhr.open('GET','send-ajax-data.php');
xhr.send(null);
在这里,我们创建了一个能向服务器发出HTTP请求的类的实例。然后调用其open方法,其中第一个参数是HTTP请求方法,第二个参数是请求页面的URL。最后,我们调用参数为null的send方法。假如使用POST请求方法(这里我们使用了GET),那么send方法的参数应该包含任何你想发送的数据。
下面是我们如何处理服务器的响应:
xhr.onreadystatechange=function(){
varDONE=4;//readyState4代表已向服务器发送请求
varOK=200;//status200代表服务器返回成功
if(xhr.readyState===DONE){
if(xhr.status===OK){
console.log(xhr.responseText);//这是返回的文本
}else{
console.log("Error:"+xhr.status);//在此次请求中发生的错误
}
}
}
onreadystatechange是异步的,那么这就意味着它将可在任何时候被调用。这种类型的函数被称为回调函数——一旦某些处理完成后,它就会被调用。在此案例中,这个处理发生在服务器。
示例
便捷的Ajax方法也是不少人依赖jQuery的原因,但实际上原生JavaScript的Ajaxapi也很强大,并且基本的使用在各个浏览器中的差异不大,因此完全可以自行封装一个Ajax对象,下面是封装好的Ajax对象:
//Ajax方法
//惰性载入创建xhr对象
functioncreateXHR(){
if('XMLHttpRequest'inwindow){
createXHR=function(){
returnnewXMLHttpRequest();
};
}elseif('ActiveXObject'inwindow){
createXHR=function(){
returnnewActiveXObject("Msxml2.XMLHTTP");
};
}else{
createXHR=function(){
thrownewError("Ajaxisnotsupportedbythisbrowser");
};
}
returncreateXHR();
}
//Ajax执行
functionrequest(ajaxData){
varxhr=createXHR();
ajaxData.before&&ajaxData.before();
//通过事件来处理异步请求
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
if(xhr.status==200){
if(ajaxData.dataType=='json'){
//获取服务器返回的json对象
jsonStr=xhr.responseText;
json1=eval('('+jsonStr+')'),
json2=(newFunction('return'+jsonStr))();
ajaxData.callback(json2);
//ajaxData.callback(JSON.parse(xhr.responseText));//原生方法,IE6/7不支持
}else
ajaxData.callback(xhr.responseText);
}else{
ajaxData.error&&ajaxData.error(xhr.responseText);
}
}
};
//设置请求参数
xhr.open(ajaxData.type,ajaxData.url);
if(ajaxData.noCache==true)xhr.setRequestHeader('If-Modified-Since','0');
if(ajaxData.data){
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send(ajaxData.data);
}else{
??
xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');
xhr.send(null);
}
returnxhr;
}
functionpost(ajaxData){
ajaxData.type='POST';
var_result=request(ajaxData);
return_result;
}
functionget(ajaxData){
ajaxData.type='GET';
ajaxData.data=null;
var_result=request(ajaxData);
return_result;
}
下面给出一个使用例子:
index.html
<!DOCTYPEHTML>
<htmllang="zh-CN">
<head>
<metacharset="UTF-8">
<title>原生JavaScript实现Ajax</title>
<linkrel="stylesheet"type="text/css"media="all"href="./common/common.css"/>
<style>
#content{text-align:center;font-family:'lucidaGrande','MicrosoftYahei'}
#content.btn_ctr{display:block;width:120px;height:30px;margin:0auto20px;background:#53a7bb;color:#fff;font-weight:bold;font-size:14px;line-height:30px;text-decoration:none;
border-radius:4px;
}
#test{width:280px;height:130px;margin:0auto;padding:15px;background:#fff;border-radius:4px;text-align:left;}
</style>
</head>
<body>
<divid="header">
<divid="header-content">
<divid="header-inside">
<pclass="go-to-article"><ahref="http://kayosite.com/css3-animation.html"title="打开原文"target="_blank">BackToArticle</a></p>
<pclass="go-to-blog"><ahref="http://kayosite.com"title="进入我的博客Kayo'sMelody"target="_blank">MyBlog</a></p>
<pclass="copyright">DemoByKayo©Copyright2011-2013</p>
</div>
<h1>CSS3Animation</h1>
</div>
</div>
<divid="content">
<aclass="btn_ctr"href="javascript:;"onclick="get({url:'./ajax.html',callback:function(out){document.getElementById('test').innerHTML=out;}})">Ajax获取内容</a>
<divid="test"></div>
</div>
<script>
//Ajax方法,这里不在重复列出
</script>
</body>
</html>
ajax.html
<!DOCTYPEHTML> <htmllang="zh-CN"> <head> <metacharset="UTF-8"> <title>ajax</title> </head> <body> <p>成功获取到这段文本</p> </body> </html>
具体的效果可以浏览完整Demo。
