原生js封装ajax请求

一个完整的ajax请求封装,适用场景:

  1. get 请求
  2. post请求
  3. 表单提交方式
  4. 表单上传文件
function ajax(options) {
    var method = options.method || 'get'; //请求方法,默认get
    var url = options.url || ''; //请求url
    var succFn = options.success || function(){console.log('请求成功!')}; //请求成功回调
    var data = options.data || null; // 请求数据
    var isAsync = options.async === undefined ? true : options.async; //是否是异步请求,默认true
    var isFormData = options.isFormData || false; //是否采用表单提交数据的方式,默认false
	
	// 创建异步象
    var ajax = null;
    if(window.XMLHttpRequest) {
        ajax = new XMLHttpRequest();
    }
    else {
        ajax = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    // get请求参数处理
    if (data && method.toLowerCase() === 'get') {
        url += '?';
        for(var key in data) {
            url += key + "=" + encodeURIComponent(data[key]) + "&";
        }
        url = url.slice(0, url.length - 1);
    }

    ajax.open(method, url, isAsync);
	
	// post请求处理, 非表单数据提交方式
    if(method.toLowerCase() == 'post' && !isFormData) {
        var contentType = "application/x-www-form-urlencoded";
        ajax.setRequestHeader("Content-type", options.contentType || contentType);
        
        if(data) {
            var dataJSON = '';
            for(var key1 in data) {
                dataJSON += key1 + "=" + encodeURIComponent(data[key1]) + "&"; 
                // encodeURIComponent 当get请求参数中有特殊字符时必须转码,否则会丢失特殊符号
            }
            dataJSON = dataJSON.slice(0, dataJSON.length - 1);
            ajax.send(dataJSON);
        } else {
            ajax.send();
        }

    }
	
	// post请求 表单数据提交方式
    if(isFormData) { 
        ajax.send(data);
    }

    if(method.toLowerCase() === 'get') {
        ajax.send();
    }

    ajax.onreadystatechange = function () {
        if (ajax.readyState==4 && ajax.status==200) {
            succFn(ajax);
        }
    }
}

使用方式:

ajax({
   method: 'get',
   url: 'http://127.0.0.1/ajax/url',
   data: {
   		id: id,
   		name: name
   },
   success: function(res) {
   		console.log(res);
   }
});
ajax({ 
  method: 'post',
   url: 'http://127.0.0.1/post/data/url',
   data: {
       name: name,
       id: id,
       type: type
   },
   success: function(res) {
   		console.log(res);
   }
})

表单方式提交异步请求:

var file = document.getElementById('file');
file.addEventListener('change', function() {  
   var files = this.files;

    var formData = new FormData();
    formData.append("files[]", files[0]); // []表示files字段的数据格式为数组
    formData.append("parentId", '父级id');
    ajax({
       method: "post",
       url: 'http://127.0.0.1/upload/file/',
       contentType: "multipart/form-data",
       isFormData: true, // 使用表单数据提交方式
       data: formData,
       success: function(res) {
			console.log(res);
       }
   })
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值