本文已参与掘金创作者训练营第三期「高产更文」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力
前言
今天前面两篇文章的探索,我们已经封装好AJAX,但是对比其他人封装的,我们这个还存在许多问题,需要完善。下面一起来看看
问题
jQuery传值的方式如下
$.ajax({
type: "post",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});
复制代码
在使用自己封装的代码的时候,感觉跟jQuery官方的ajax还是有一定的差异,所以进一步完善
首先,传递请求类型的大小写,官方的是都可以传递成功
第二,我们传递的是很多个参数,参数的顺序必须保持一致。官方传递的是一个对象,对象里面的值,不要求先后顺序
第三,我们穿的数据用的名字是obj,官方用的是data,语义更适合
解决方案
解决第一个问题使用toLowerCase()或者toUpperCase()将类型转成大写或小写在对比,如:
option.type.toLowerCase() === 'get'
复制代码
解决第二个问题将传参换成一个对象;之前里面用的参数通过:对象名.属性名的形式获取。
function ajax(option){....}
复制代码
解决第三个问题,就是数据换名称data就可以了
这样基本差不多了,最后再来完善
完善代码
function ajax(option){
var str = objToString(option.data);
var xmlhttp,timer;
if (window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
} else{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (option.type.toLowerCase() === 'get') {
xmlhttp.open(option.type,option.url+"?t=" +str,true);
xmlhttp.send();
}else{
xmlhttp.open(option.type,option.url,true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(str);
}
xmlhttp.onreadystatechange = function(){
clearInterval(timer);
if (xmlhttp.readyState === 4) {
if (xmlhttp.status >= 200 && xmlhttp.status < 300 || xmlhttp.status == 304) {
option.success(xmlhttp);
}else{
option. error(xmlhttp);
}
}
}
}
function objToString(data){
data.t = new Date().getTime();
var res =[];
for(var key in data){
res.push(encodeURIConponent(key) + " = " +encodeURIConponent(data.[key]));
}
return res.join("&");
}
if(timeout){
timer = setInterval(function(){
xmlhttp.abort();
clearInterval(timer);
},timeout);
}
复制代码
END
以上就是本文的所有内容
如有问题欢迎留言评论~