ajax想必做前端开发的,没有不对冲熟悉的,异步获取数据,不用刷新整个页面,局部dom刷新就可以进行前后交互,前后的基本流程大概如下:
①先本地创建一个XMLHttpRequest对象,var
xmlHttp =
new
XMLHttpRequest();
②创建连接,xmlHttp.open(
'GET'
,
'demo.php'
,
'true'
);
③向后台发送请求,xmlHttp.send();
④根据返回状态处理数据,xmlHttp.onreadystatechange =
function
(){
if
(xmlHttp.readyState === 4 & xmlHttp.status === 200){
}
}。
上述只是简单的一个ajax的介绍,具体在工作中使用的话,需要把各种情况考虑到,进而对ajax,进行封装处理,下面将仔细进行如下解析:
①:把json对象转换为字符串的一个封装函数,下面用get请求的话需要拼接url.
function json2url(json){
json.t = Math.random();
var arr = [];
for(var name in json){
arr.push(name+"="+encodeURIComponent(json[name]));/字符转换 防止乱码
}
}
return arr.join("&");
}
②个人理解对ajax,进行了封装,考虑了不同浏览器的兼容性,考虑了请求超时 ,成功,失败三种情况下的处理,考虑了不同请求方式 get post 考虑了乱码情况等。
function jaxa(json){ //默认值 json = json || {}; if(!json.url)return; json.data = json.data || {};//请求后台数据需要的字段 json.type = json.type || "GET";//请求方式 json.timeout = json.timeout || 10000;//请求超时默认时间 if(window.XMLHttpRequest){//chrome fixefox 高级浏览器 var oAjax = new XMLHttpRequest(); }else{//IE浏览器 var oAjax = new ActiveXObject("MIcrosoft.XMLHTTP"); } //建立连接 是否异步 switch(json.type.toLowerCase()){//两种不同方式进行不同的建立方式 case "get": oAjax.open("GET",json.url+"?"+json2url(json.data),true); //get GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连 oAjax.send();//发送 break; case "post": oAjax.open("POST",json.url,true); oAjax.setRequestHeader("Content-Type","application/x-www-from-urlencoded"); oAjax.send(json2url(json.data));//发送 //POST把提交的数据则放置在是HTTP包的包体中。需要send的时候把字符串类型的data发给后台。 break; } json.loading&&json.loading();//请求数据时可以做相应的加载设计 比如增加加载条等。 var timer = setTimeout(function(){//规定时间内是否请求道数据 请求不到数据的话 请求失败的处理 json.complete&&json.complete();//请求失败需要做的事情 json.error&&json.error(oAjax.status);//失败后返货的状态码 oAjax.onreadystatechange = null;//把创建的对象 变为空 让垃圾回收机制回收 },json.timeout); //接收 当网络状态进行改变的时候 函数 oAjax.onreadystatechange = function(){ if(oAjax.readyState === 4){//网络状态为4正常情况下 if(oAjax.status > 200 && oAjax.status < 304 || oAjax.status === 304){//aJax状态码 200 到300 之间是成功 304是重定向也是成功 clearTimeout(timer);//完成了就得把创建的定时器关掉 也就不再看请求是否超时 json.complete&&json.complete();//成功后需要做的事儿 json.success&&json.success(oAjax.responseText);//成功后返回成功状态数据。 }else{//不在上述状态码区间的 为请求失败 clearTimeout(timer);//请求失败,也就不再看请求是否超时 关闭定时器 json.complete&&json.complete();//失败了做的事儿 json.error&&json.error(oAjax.status);//失败后返货的状态码 } } } }
不合理的地方 大家多多指教,谢谢。