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

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

猜你喜欢

转载自blog.csdn.net/zhai_865327/article/details/85276418