手动封装一个ajax兼容性写法
首先我们先来了解一下ajax的过程及环境
1.浏览器
2.ajax对象
写法:window.XMLHttpRequest
兼容IE写法:ActiveXObject(‘Microsoft.XMLHttp’)
3.ajax.open(method,url,true/false);
method:请求方式 如GET/POST/DELETE
true:表示异步
4.ajax.send()发送至服务器
异步过程,如method是post
send()中需要填写内容
5.onreadystatechange 监听变化状态
由于send是一个异步的过程,如果直接用ajax.readyState == 4
来判断响应内容是否解析完成是行不通的,因为send()在发送过程中
ajax.readyState == 4
这个过程就被实行了所以这个必不可能返回true
所以用onreadystatechange监听,每当readyState值变化,监听里的命令就执行一次
6.判断status == 200
判断status 即服务器返回码是否等于200,200代表成功执行函数
可以将要执行的函数先封装好,作为一个回调函数使用
即if(ajax.status == 200){
callback(xhr.responseText)
}
由于post get有以下几点区别,所以封装的时候还应该注意以下几点:
1.post 传递数据是放在send()中,而get的值是拼接在open(url)后面
2.post方式在send()之前还需要写一个表头
ajax.setRequestHeader(‘type’,‘application/x-www-form-urlencoded’);
所以在封装过程中需要写一个兼容post跟get方式的过程
function ajaxFun(method,url,data,callback,flag) {
var xhr = null;//创建一个ajax对象
//-------先封装兼容IE版本
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject('Microsoft.XMLHttp');
}
//3.open过程
if(method == 'GET'){
xhr.open(method, url + '?' + data, flag);
//4.send过程
xhr.send();
}else if(method =='post'){
//3.open过程
xhr.open(method,url,flag);
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
//4.send过程
xhr.send(data);
}
//5.监听
//由于send是一个异步的过程所以不能用xhr.readyState == 4来判断
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
callback(xhr.responseText)
}
}
}
}
希望对你有所帮助~