对jquery的ajax进行二次封装

代码如下(欢迎文明交流,留下宝贵建议,个人思路,不喜勿喷)
function ajax(opt){
	var defaultSettings = {
		data: {},
		type: 'get',
		dataType: 'json',
		headers:{'Authorization': getStore('token')},
		beforeSend: function(){
			openLoad('loading.gif')
		},
		complete:function(){  
			closeLoad();
		},
   		error: function(xhr){
   			if(xhr.status == 401){
   				showTips('您未登录')
   			}else if(xhr.status == 403){
   				showTips('您没有权限')
   			}else if(xhr.status == 500){
   				showTips('服务器发生错误,请稍后刷新页面')
   			}else{
   				showTips('未知错误')
   			}
   		}
	}
	for(var key in opt){
		defaultSettings[key] = opt[key]
		if(key == 'url')
			defaultSettings[key] = '/api/' + opt[key] + '?format=json&time=' + new Date().getTime()
	}
	if(arguments[1]){ //如果是图片上传,需要传递第二个参数,必须内容
		defaultSettings.traditional = true
		defaultSettings.processData = false
		defaultSettings.contentType = false
	}
	return $.ajax(defaultSettings)
}

function showTips(msg){
	var tipsEl = $('<div></div>').text(msg).css({
		"text-align":"center",
		"line-height":"40px",
		"height":'40px',
		"background":'rgba(0,0,0,0.5)',
		'position':'fixed',
		"left":'50%',
		"top":'50%',
		"transform":'translate(-50%,-50%)',
		"z-index":999999,
		'padding':'15px 30px',
		"box-sizing":'border-box',
		"display":'none',
		"font-size":'14px'
	})

	tipsEl.appendTo($('body')).fadeIn(500).delay(1000).fadeOut(500,function(){
		tipsEl.remove()
	})
}
function getStore (name) {
	if (!name) return;
	return window.localStorage.getItem(name);
}
function openLoad( src ){
	var loadEl_icon = $('<i></i>').css({
		"width":'50px',
		"height":'50px',
		"margin":'auto',
		"background":'url(' + src + ') no-repeat center center',
		'background-size':'cover'
	})
	var lodeEl_inner = $('<div class="ui-loading-inner"></div>').css({
		"width":'200px',
		"height":'200px',
		"margin":'auto',
		"border-radius":'5px',
		"background":'rgba(0,0,0,0.5)',
		"display":'flex'
	}).append(loadEl_icon)
	var loadEl_wrap = $('<div class="ui-loading-mask"></div>').css({
		"position":'absolute',
		"left":0,"top":0,"bottom":0,"right":0,
		"background":'rgba(255,255,255,0.01)',
		"z-index":999999,
		"display":'flex'
	}).append(lodeEl_inner).appendTo($('body'))
}

function closeLoad(){
	$('.ui-loading-mask').remove()
}

在封装里默认进行了error函数的判断,也提供了页面消息提示框,调用方式如下:

ajax(formData,true) //上传图片
ajax(opt)//普通调用

参数opt的设置:

var opt = {
	url:'do_login',
	type:'post',//如果是post需要传递type,如果是get可以不传递
	data:{usrname,password},
	success(r){
		//your code here or callback(r)
	}

}

如果需要多次回调,可以这样来调用:

ajax(opt).then((r)=>{
	console.log(r)
)

看网上有许多大神都封装成了面向对象的方式,这里没有采用的原因是,ajax在一个项目中会多次使用,面向对象封装或许要采用单例模式,否则会增加程序开销,但是发现网上大多数的封装都没有注意这个问题,另外,将loading组件和提示组件放进一个对象里,可能增加代码的耦合性,单独使用不方便。

另外,代码里所有的css都应该在 .css 样式文件里定义好,这样直接创建一个元素就不用设置样式了,这里为了方便表达所以才写在了js里,用的时候可以单独拆分出来,所以这里的代码只提供一个思路,具体可以结合业务进行相应改动。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值