ajax入门之竖立XHR对象
本日帮朋侪写了一个简朴的ajax的demo,发现了一些东西,决议写一篇文章纪录一下,防止今后挖坑。
建立XMLHttpRequest
一般
function createXHR(){
if(XMLHttpRequest){
return new XMLHttpRequest();
}else{
return new ActiveXObject('Microsoft.XMLHTTP')
}
}
这一段js代码来源自w3school,用于建立兼容各浏览器的XMLHttpRequest对象的寄义:
检测客户端是不是有XMLHttpRequest,不然运用ActiveXObject
关于XMLHttpRequest对象,IE5是第一个引入XHR对象的浏览器,在IE5中,XHR是经由过程activeX对象完成的.因此在IE中能够碰到三种差别版本的XHR对象,MXSML2.XMLHTTP,MXSML2.XMLHttp.3.0和MXSML2.XMLHttp.6.0。
IE的坑
为了向我们巨大的IE浏览器“致敬”,我们必需增加分外的代码举行建立
以下代码实用与IE7以下的状况:
function createXHR(){
if(typeof argument.callee.activeXString != 'string'){
var versions = ['MXSML2.XMLHTTP','MXSML2.XMLHttp.3.0','MXSML2.XMLHttp.6.0'];
var i len;
for(i = 0;len=versions.length;i<len;i++){
try{
new ActiveXObject(varsions[i]);
argument.callee.activeXString = varsions[i];
}catch{
<!-- 跳过 -->
}
}
}
return new ActiveXObject(argument.callee.activeXString);
}
完全走一遍
但每每我不会斟酌这么多,能看懂前面的函数也是很不轻易了,再让我写出来,我的天!当人人和我这么懒的时刻,能够直接运用第一份代码,也就是w3school那一套代码,我们运用原生的XHR对象举行建立。
固然,我们这里也给出完全的代码。
function createXHR(){
if(typeof XMLHttpRequest != 'undefined'){
return new XMLHttpRequest();
}else if(typeof argument.callee.activeXString != 'string'){
var versions = ['MXSML2.XMLHTTP','MXSML2.XMLHttp.3.0','MXSML2.XMLHttp.6.0'];
var i len;
for(i = 0;len=versions.length;i<len;i++){
try{
new ActiveXObject(varsions[i]);
argument.callee.activeXString = varsions[i];
}catch{
<!-- 跳过 -->
}
}
return new ActiveXObject(argument.callee.activeXString);
}else{
throw new Error("没有XHR对象存在");
}
}
用法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo</title>
</head>
<body>
<form>
<button onclick="returnText();return false">上岸</button>
</form>
<script type="text/javascript">
function returnText(){
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('猎取失利'+xhr.status)
}
}
}
xhr.open('get','demo.php',true);
xhr.send(null);
}
function createXHR(){
if(typeof XMLHttpRequest != 'undefined'){
return new XMLHttpRequest();
}else{
return new ActiveXObject('Microsoft.XMLHTTP')
}
}
</script>
</body>
</html>
建立好XHR对象只是第一步,才是我们种种操纵的最先。
open()
open()函数会启动一个要求,但并非发送,能够看做做事之前的预备。
它吸收三个函数:
open(get/post,url,false/true)
要求范例:最经常使用的就是get和post
途径:就是要要求的操纵的文件的url
是不是异步
我们这是运用的是get体式格局,由于我们并没有要发送的数据。
异步我们挑选了true,无意中发如今运用false时刻,火狐涌现了正告:
主线程中同步的 XMLHttpRequest 已不引荐运用,因其对终端用户的用户体验存在负面影响。
细致须要再相识。
send()
自然而然,预备好了就要发送,send()只吸收一个参数,那就是要发送的数据。我们运用的是get,没有数据,那就null好了。
php
由于这篇文章主如果讲ajax,所以php部份我只用了最简朴的echo
<?php
echo '胜利了';
?>
如许就能在吸收到要求后返回一个字符串。
回调函数
我们怎样才直到php文件将数据处置惩罚完,返回给客户端了呢?
这时刻我们就须要监测XHR的readyState属性。先引见以下readyState属性:
0:初始化未完成,未挪用open()
1: 启动调永了open()函数,然则还没有send
2:发送,调永了send()函数,还没有吸收到相应
3:最先吸收,吸收到部份的数据
4:完成,吸收到了悉数数据。
所以在上面的函数中我们能够看到,我们去监测readyState属性,比及即是4的时刻,也就是数据吸收完成以后,我们最先对数据举行处置惩罚。
小结
这是一个手动建立XHR对象并运用最简朴的要领。今后回继续举行更新。引见其更细致的用法。