封装原生ajax(兼容)

/*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);
  })
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值