kc-aui
Version:
后台业务组件集合
476 lines (450 loc) • 12.4 kB
JavaScript
/**
* Copyright (c) 2018-2019 kaochong, All rights reserved.
* @fileoverview 通用方法
* @author qiuxiaoguang | qiuxiaoguang@kaochong.com
* @version 1.0 | 2019-01-02 | qiuxiaoguang // 初始版本。
* @description 通用方法封装
*/
/**
* 获取url中参数
* @param {String} query 要获取的参数,对大小写敏感
* @return {String} 要获取的参数对应的值,为获取则为空字符串
*/
export function getQuery (query) {
if (!query) return ''
const _query = window.location.search.substring(1)
const _eachQuery = _query.split('&')
let i = 0
while (i < _eachQuery.length) {
let _keyValue = _eachQuery[i].split('=')
if (_keyValue[0] === query) {
return _keyValue[1]
}
i++
}
return ''
}
/**
* 判断url中是否有参数
* @param {[String, Null]} [url=window.location.href] 传入url,默认为当前页面URL
* @return {Boolean} url是否有参
*/
export function hasQuery (url = window.location.href) {
const firstQuery = url.split('?')
if (firstQuery.length > 1) {
return true
} else {
return false
}
}
/**
* 删除url中参数
* @param {String} query 要删除的query
* @param {String} url 要删除的url
* @return {String} 返回删除后的url
*/
export function delQuery (query, url = window.location.href) {
let urlArr = url.split('?')
if (urlArr.length > 1 && urlArr[1].indexOf(query) > -1) {
let _search = urlArr[1]
let obj = {}
let arr = _search.split('&')
for (let i = 0; i < arr.length; i++) {
arr[i] = arr[i].split('=')
obj[arr[i][0]] = arr[i][1]
}
delete obj[query]
const urlte = `${urlArr[0]}?${JSON.stringify(obj).replace(/["{}]/g, '').replace(/:/g, '=').replace(/,/g, '&')}`
return urlte
} else {
return url || window.location.href
}
}
/**
* 验证用户输入的手机号或姓名是否合法
* @param {Object} options
* {String} type 验证类型(phone or name)
* {String} content 验证内容
* @return {Boolean} 是否合法
*/
export function verifyInput (options) {
switch (options.type) {
case 'phone':
const _phoneReg = /^1((3\d)|(4[5, 7])|(5\d)|7([0, 6, 7, 8])|8(\d))\d{8}$/
return _phoneReg.test(options.content) === true
case 'name':
const _nameReg = /^[\u4e00-\u9fa5]+$/
return _nameReg.test(options.content) === true
default:
return false
}
}
/**
* 获取字符串字节长度(中文算两个字节)
* @param {[String, Number]} val 需要判断的字符串
* @return {Number} 长度
*/
export function getByteLen (val) {
if (!val && val !== 0) return 0
let _length = 0
const _val = val.toString()
for (let i = 0; i < _val.length; i++) {
const _char = _val.charCodeAt(i)
if (_char > 127 || _char === 94) {
_length += 2
} else {
_length++
}
}
return _length
}
/**
* 判断是否是函数
* @param {Function} func 传入函数
* @return {Boolean} 是否是函数
*/
export function isFunction (func) {
return func && Object.prototype.toString.call(func) === '[object Function]'
}
/**
* 判断是否是对象
* @param {Object} obj 传入对象
* @return {Boolean} 是否是对象
*/
export function isObject (obj) {
return obj && Object.prototype.toString.call(obj) === '[object Object]'
}
/**
* 判断是否是数字
* @param {Number} num 传入数字
* @return {Boolean} 是否是数字
*/
export function isNumber (num) {
return num && Object.prototype.toString.call(num) === '[object Number]'
}
/**
* 判断是否是真数组
* @param {Array} arr 传入数组
* @return {Boolean} 是否是真数组
*/
export function isArray (arr) {
return arr && Object.prototype.toString.call(arr) === '[object Array]'
}
/**
* 判断是否是伪数组
* @param {Object} obj 传入对象
* @return {Boolean} 是否是伪数组
*/
export function isLikeArray (obj) {
if (isFunction(obj) || obj === window) return false
if (isNumber(obj.length) && obj.length >= 0 && (obj.length - 1) in obj) return true
return false
}
/**
* localStorage简单封装
* @function get 获取storage
* @params {String} key 要获取的key
* @function set 设置storage
* @params {String} key 要设置的key
* @params {[String, Number, Object]} val 要设置的val
* @function remove 删除storage
* @params {String} key 要删除的key
* @function clear 完全清除storage
*/
export const Storage = {
get (key, storage = localStorage) {
const _obj = storage.getItem(key)
if (_obj && _obj !== 'undefined' && _obj !== 'null') {
return JSON.parse(_obj)
}
return ''
},
set (key, val, storage = localStorage) {
storage.setItem(key, JSON.stringify(val))
},
remove (key, storage = localStorage) {
if (key) {
storage.removeItem(key)
} else {
this.clear()
}
},
clear (storage = localStorage) {
storage.clear()
}
}
/**
* 深拷贝
* @param {Object} [obj={}] 深拷贝对象
* @return {Object} 深拷贝后的结果
*/
export function cloneDeep (obj = {}) {
if (!isObject(obj)) return obj
let newobj = {}
for (let attr in obj) {
newobj[attr] = cloneDeep(obj[attr])
}
return newobj
}
/**
* Cookie操作封装
* @function get 获取cookie
* @params {String} key 要获取的key
* @function set 设置cookie
* @params {String} key 要设置的key
* @params {[String, Number Object]} val 要设置的val
* @function remove 删除cookie
* @params {String} key 要删除的key
* @function clear 完全清除cookie
*/
export const Cookie = {
get (key) {
const _cookie = '' + document.cookie
let ind = _cookie.indexOf(key)
if (ind === -1 || key === '') return ''
let ind1 = _cookie.indexOf('; ', ind)
if (ind1 === -1) ind1 = _cookie.length
// 读取Cookie值
return unescape(_cookie.substring(ind + key.length + 1, ind1))
},
set (key, value) {
const _now = new Date()
// Cookie过期时间
let _expire = new Date()
// 如果未设置nDays参数或者nDays为0,取默认值1
// if(nDays == null || nDays == 0) nDays = 1;
// 计算Cookie过期时间【 3600000 * 24 为一天】
_expire.setTime(_now.getTime() + 3600000 * 24 * 30) // 一个月
document.cookie = `${key}=${escape(value)}; path=/; expires=${_expire.toGMTString()}`
},
remove (key) {
// const myDate = new Date()
// myDate.setTime(-1000) // 设置时间
// document.cookie = `${key}=; expires=${myDate.toGMTString()}`
this.set(key, '')
},
removes (keys) {
const _cookies = isArray(keys) ? keys : [keys]
for (let i = 0; i < _cookies.length; i++) {
this.set(_cookies[i], '')
}
},
clear () {
const _now = new Date()
_now.setTime(-1000) // 设置时间
let _cookie = document.cookie
let _cookieArray = _cookie.split('; ')
for (let i = 0; i < _cookieArray.length; i++) {
const _key = _cookieArray[i].split('=')
document.cookie = `${_key[0]}=; expires=${_now.toGMTString()}`
}
}
}
/**
* Url操作
* @type {Object}
*/
export const Uri = {
decode (url) {
return decodeURIComponent(url)
},
encode (url) {
return encodeURIComponent(url)
}
}
/**
* 判断是否是Dom
* @param {Element} obj
* @return {Boolean}
*/
export function isDom (obj) {
return typeof HTMLElement === 'object'
? obj instanceof HTMLElement
: obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string'
}
/**
* 判断是否是NodeList
* @param {NodeList} nodeList
* @return {Boolean}
*/
export function isNodeList (nodeList) {
return nodeList.length > 1 && Array.prototype.every.call(nodeList, node => {
return isDom(node)
})
}
/**
* 两个数组取交集
* @param {Array} arr1 数组1
* @param {Array} arr2 数组2
* @return {Array} 结果数组
*/
export function intersect (arr1, arr2) {
let result = []
let obj = {}
for (let i = 0; i < arguments.length; i++) {
for (let j = 0; j < arguments[i].length; j++) {
const str = arguments[i][j]
if (!obj[str]) {
obj[str] = 1
} else {
obj[str]++
if (obj[str] === arguments.length) {
result.push(str)
}
}
}
}
return result
}
/**
* 多个数组取并集
* @return {Array} 并集数组
*/
export function union () {
let arr = []
let obj = {}
for (let i = 0; i < arguments.length; i++) {
for (let j = 0; j < arguments[i].length; j++) {
const str = arguments[i][j]
if (!obj[str]) {
obj[str] = 1
arr.push(str)
}
}
}
return arr
}
// obj转url
export function objToUrl (param) {
if (param === null) return ''
var tempArr = []
for (var key in param) {
if (param.hasOwnProperty(key) &&
param[key] !== undefined &&
param[key] !== null) {
tempArr.push(key + '=' + param[key])
}
}
if (tempArr.length) {
return '?' + tempArr.join('&')
}
return ''
}
// 获取query历史值,转换对象判空并返回
export function getPreSubmitData (except) {
var queryData = urlToObj(location.href)
Object.keys(queryData).forEach(item => {
if (except.indexOf(item) >= 0 || (queryData[item] !== 0 && queryData[item] === '')) {
delete queryData[item]
} else {}
})
return queryData
}
// url中query的部分转obj
export function urlToObj (url) {
if (url === null || url.indexOf('?') < 0) return {}
var query = location.href.split('?')[1]
var tempObj = {}
query.split('&').forEach(function (item) {
var key = item.split('=')[0]
var value = Uri.decode(item.split('=')[1])
if (!isNaN(Number(value))) {
tempObj[key] = Number(value)
} else {
tempObj[key] = value
}
})
return tempObj
}
/**
* 替换url中query值
* @param url
* @param query
* @param value
* @returns {string}
*/
export function replaceQuery (url = window.location.href, query, value) {
let urlArr = url.split('?')
if (urlArr.length > 1 && urlArr[1].indexOf(query) > -1) {
let _search = urlArr[1]
let obj = {}
let arr = _search.split('&')
for (let i = 0; i < arr.length; i++) {
arr[i] = arr[i].split('=')
obj[arr[i][0]] = arr[i][1]
}
obj[query] = encodeURI(value)
return `${urlArr[0]}?${JSON.stringify(obj).replace(/["{}]/g, '').replace(/:/g, '=').replace(/,/g, '&')}`
} else {
return url || window.location.href
}
}
/**
* @param {Function} func
* @param {number} wait
* @param {boolean} immediate
* @return {*}
*/
export function debounce (func, wait, immediate) {
let timeout, args, context, timestamp, result
const later = function () {
// 据上一次触发时间间隔
const last = +new Date() - timestamp
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last)
} else {
timeout = null
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args)
if (!timeout) context = args = null
}
}
}
return function (...args) {
context = this
timestamp = +new Date()
const callNow = immediate && !timeout
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait)
if (callNow) {
result = func.apply(context, args)
context = args = null
}
return result
}
}
/**
* 将多维数组转化为一维数组
* @param {Array} array 多维数组
* @return {Array} 一维数组
*/
export function flatten (array) {
return [].concat(...array.map(item => Array.isArray(item) ? flatten(item) : item))
}
export default {
getQuery,
delQuery,
hasQuery,
verifyInput,
getByteLen,
isFunction,
isObject,
isArray,
isNumber,
isLikeArray,
Storage,
cloneDeep,
Cookie,
Uri,
isDom,
isNodeList,
intersect,
union,
replaceQuery,
urlToObj,
objToUrl,
getPreSubmitData,
flatten
}