utils.js 7.63 KB
// 正在表达式
export const REGEXPS = {
	mobile: /^1\d{10}$/
};

// 验证手机
export function checkMobile(str) {
	return REGEXPS.mobile.test(str);
}

/**
 * 链接参数转换为obj
 * 入参 完整链接
 * @param {*} url
 */
export function param2Obj(url) {
	const search = url.split("?")[1];
	if (!search) {
		return {};
	}
	return JSON.parse(
		'{"' +
			decodeURIComponent(search)
				.replace(/"/g, '\\"')
				.replace(/&/g, '","')
				.replace(/=/g, '":"') +
			'"}'
	);
}

//获取cookie、
export function getCookie(name) {
	var arr,
		reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
	if ((arr = document.cookie.match(reg))) return arr[2];
	else return null;
}

//设置cookie
export function setCookie(c_name, value, second) {
	var exdate = new Date();
	exdate.setTime(exdate.getTime() + second * 1000);
	document.cookie =
		c_name +
		"=" +
		escape(value) +
		(second == null ? "" : ";expires=" + exdate.toGMTString());
}

//删除cookie
export function delCookie(name) {
	var exp = new Date();
	exp.setTime(exp.getTime() - 1);
	var cval = getCookie(name);
	if (cval != null)
		document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}

/**
 * 获取环境信息
 * @return {Object} 环境信息对象
 */
export function getEnv() {
	var nav = window.navigator;
	var env = {
		iphone: false,
		ipad: false,
		android: false,
		pc: false,
		ios: false,
		ver: "0"
	};

	var ua = nav.userAgent;
	var android = ua.match(/(Android)\s+([\d.]+)/);
	var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
	var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/);
	if (ipad) {
		env.ipad = (ipad[1] && true) || false;
		env.ver = (ipad[2] && ipad[2].replace(/-/g, ".")) || "";
		env.ios = true;
	} else if (iphone) {
		env.iphone = (iphone[1] && true) || false;
		env.ver = (iphone[2] && iphone[2].replace(/-/g, ".")) || "";
		env.ios = true;
	} else if (android) {
		env.android = (android[1] && true) || false;
		env.ver = android[2];
	} else {
		env.pc = true;
	}

	return env;
}

/**
 * 设定页面 title
 * @param {[type]} title [description]
 */
export function setTitle(title) {
	if (!title) {
		return;
	}
	document.title = title;
	// if (ENV.ios && navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1) {
	// 修复微信端IOS无法修改document.title的情况
	if (
		getEnv().ios &&
		(navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1 ||
			navigator.userAgent.toLowerCase().indexOf("alipay") !== -1)
	) {
		//修复IOS微信端和支付宝无法修改document.title的情况
		var $iframe = document.createElement("iframe");
		$iframe.className = "C-hiddenIframe";
		$iframe.src = "/" + location.pathname.split("/")[1] + "/favicon.ico";
		$iframe.style.visibility = "hidden";
		$iframe.style.width = "1px";
		$iframe.style.height = "1px";
		$iframe.onload = function onIframeLoad() {
			setTimeout(function() {
				$iframe.onload = null;
				onIframeLoad = null;
				document.body.removeChild($iframe);
				$iframe = null;
			}, 0);
		};
		document.body.appendChild($iframe);
	}
}

// 为链接添加参数
export function addQuery(url, query) {
	query = query || {};
	query = (function(query) {
		var q = [];
		Object.keys(query).forEach(function(_q) {
			q.push(_q + "=" + query[_q]);
		});
		return q.join("&");
	})(query);
	if (url.indexOf("?") !== -1) {
		url += "&" + query;
	} else {
		url += "?" + query;
	}
	return url;
}

/**
 * 获得当前页面的path
 * @return {String} 页面path
 */
export function getPath() {
	var path = window.location.hash;
	path = path || "#/";
	path = path === "#/" ? "#/index" : path;
	path = path.split("?");
	return path[0];
}

// 获取 url 参数
export function getQuery(name) {
	return (
		decodeURIComponent(
			(new RegExp("[?|&]" + name + "=" + "([^&;]+?)(&|#|;|$)").exec(
				location.href
			) || [, ""])[1].replace(/\+/g, "%20")
		) || null
	);
}

/**
 * 升序排列
 * @param name  主要参数
 * @param minor 次要参数  主要参数相同时,比较次要参数
 */
export function ascSort(name, minor) {
	return function(o, p) {
		var a, b;
		if (o && p && typeof o === "object" && typeof p === "object") {
			a = o[name];
			b = p[name];
			if (a === b) {
				return typeof minor === "function" ? minor(o, p) : 0;
			}
			if (typeof a === typeof b) {
				return a < b ? -1 : 1;
			}
			return typeof a < typeof b ? -1 : 1;
		} else {
			// throw ("error");
			return null;
		}
	};
}

/**
 * 升序排列
 * @param name  主要参数
 * @param minor 次要参数  主要参数相同时,比较次要参数
 */
export function descSort(name, minor) {
	return function(o, p) {
		var a, b;
		if (o && p && typeof o === "object" && typeof p === "object") {
			a = o[name];
			b = p[name];
			if (a === b) {
				return typeof minor === "function" ? minor(o, p) : 0;
			}
			if (typeof a === typeof b) {
				return a > b ? -1 : 1;
			}
			return typeof a > typeof b ? -1 : 1;
		} else {
			// throw ("error");
			return null;
		}
	};
}

/**
 * 从数组中获取 key未value的对象
 * @param {*} value
 * @param {*} key
 * @param {*} list
 */
export function getObjByListKeyValue(value, key, list) {
	let result = null;
	list.forEach(element => {
		if (element[key + ""] == value) {
			result = element;
		}
	});
	return result;
}

/**
 * 把 \n换行符转换成<br>
 * 转换后需要用 v-html渲染
 * 用{{}}会当成字符串把 html渲染出来
 */
export function formatBr(str) {
	str = str.replace(/\n/g, "<br/>");
	return str;
}

// dd-MM-yyyy转yyyy-MM-dd
export function ddMMyyyy2yyyyMMdd(str) {
	return str.replace(/-/g, "").replace(/^(\d{2})(\d{2})(\d{4})$/, "$3-$2-$1");
}

/**
 * @desc 函数防抖
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param immediate true 表立即执行,false 表非立即执行
 */
export function debounce(func, wait, immediate) {
	let timeout;

	return function() {
		let context = this;
		let args = arguments;

		if (timeout) clearTimeout(timeout);
		if (immediate) {
			var callNow = !timeout;
			timeout = setTimeout(() => {
				timeout = null;
			}, wait);
			if (callNow) func.apply(context, args);
		} else {
			timeout = setTimeout(function() {
				func.apply(context, args);
			}, wait);
		}
	};
}

/**
 * @desc 函数节流
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param type 1 表时间戳版,2 表定时器版
 * 时间戳版的函数触发是在时间段内开始的时候,而定时器版的函数触发是在时间段内结束的时候。
 */
export function throttle(func, wait, type) {
	if (type === 1) {
		var previous = 0;
	} else if (type === 2) {
		var timeout;
	}
	return function() {
		let context = this;
		let args = arguments;
		if (type === 1) {
			let now = Date.now();

			if (now - previous > wait) {
				func.apply(context, args);
				previous = now;
			}
		} else if (type === 2) {
			if (!timeout) {
				timeout = setTimeout(() => {
					timeout = null;
					func.apply(context, args);
				}, wait);
			}
		}
	};
}

/**
 * 几种常用的校验方式
 * @param {string} type
 * @param {string} value
 */
export function contactMethodCheck(type, value) {
	if (type == "hkmobile") {
		// return /^[5689]{1}\d{7}$/.test(value);
		return /^(\+)?(852)?(\-)?(5|6|8|9)\d{7}$/.test(value);
	}

	if (type == "mobile") {
		// return /^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$/.test(value);
		return /^(\+)?(86)?(\-)?1\d{10}$/.test(value);
	}

	if (type == "email") {
		return /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/.test(value);
	}
	return true;
}

export function policyNumberCheck(policyNumber) {
	return /^(P|p)(0001|0002)\d{11}$/.test(policyNumber);
}

export function checkVerifyCode(verifyCode) {
	return /^\d{6}$/.test(verifyCode);
}

export function checkName(name) {
	return /^[\u4E00-\u9FA5_a-zA-Z\s\.]+$/.test(name);
}