/*function ajax({type,url,data,dataType,...})
* url: 请求地址(必须) String
* type: 请求类型(可选) String get(默认) | post
* data: 请求携带参数(可选) Object
* dataType: 服务器端返回值类型(可选) String json(默认)||text
* contentType: 发送数据流的编码类型 String application/x-www-form-urlencoded(默认) | multipart/form-data | application/json | text/xml
* withCredentials: 是否携带跨域凭证 Boolean true(默认) | false
* */
function ajax({
url,
type = 'get',
data,
dataType = 'json',
contentType = 'application/x-www-form-urlencoded',
withCredentials = true
}) {
//如果是get请求,且传入了data参数,才需要拼接url和data为get请求的完整地址
if (type.toLowerCase() === "get" && data) {
var paramArr = [];
for (key in data) {
if (data.hasOwnProperty(key)) {
// 将参数进行编码(IE浏览器不能自动对get请求中的中文参数进行编码)
paramArr.push(key + '=' + encodeURI(data[key]));
}
}
url += "?" + paramArr.join('&');
}
//promise封装
return new Promise(function (resolve) {
//AJAX 4步/5步:
//1.获得xhr对象
if (XMLHttpRequest) {
var xhr = new XMLHttpRequest();
} else {
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
//2. 建立连接
xhr.open(type, url, true);
//是否携带跨域信息
xhr.withCredentials = withCredentials;
//返回数据格式
xhr.responseType= dataType;
//3. 设置请求状态回调函数
xhr.onreadystatechange = function () {
//如果请求完成,且成功!
if (xhr.readyState == 4 && xhr.status == 200) {
if (dataType.toLowerCase() !== "json") {
//如果服务器端响应类型不是json,则调用后续resolve操作,并传入原始responseText,做后续处理
resolve(xhr.responseText);
} else {
//如果服务器端响应类型是json,则自动调用JSON.parse转为js对象,再交给resolve函数做后续处理
resolve(JSON.parse(xhr.responseText));
}
}
}
//4.只有type为post,才需要设置请求头
if (type.toLowerCase() == "post")
xhr.setRequestHeader("Content-Type", contentType);
//5.只有type为post,才需要send时,传入参数
xhr.send(type.toLowerCase() == "post" ? data : null);
})
}
封装原生ajax(兼容)
最新推荐文章于 2023-04-05 17:32:02 发布