DOM操作
找元素的第N级父元素
export function parents (ele, n = 1) {
while (ele && n) {
ele = ele.parentElement ? ele.parentElement : ele.parentNode
n--
}
return ele
}
获取指定元素距离屏幕的距离
export function getAbsoluteLocation (element) {
if (arguments.length != 1 || element == null) {
return false
}
let offsetTop = element.offsetTop
let offsetLeft = element.offsetLeft
let offsetWidth = element.offsetWidth
let offsetHeight = element.offsetHeight
while (element = element.offsetParent) {
offsetTop += element.offsetTop
offsetLeft += element.offsetLeft
}
return {
top: offsetTop,
left: offsetLeft,
offsetWidth: offsetWidth,
offsetHeight: offsetHeight
}
}
给定页面上的DOM元素,将访问元素本身及其所有后代(不仅仅是它的直接子元素)
export function traverse (element, callback) {
callback(element)
var list = element.children
for (var i = 0; i < list.length; i++) {
traverse(list[i], callback)
}
}
平滑的返回到页面顶端
export function goTop () {
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop
scrollTop = scrollTop / 1.1
if (scrollTop > 0) {
window.scrollTo(0, scrollTop)
requestAnimFrame(goTop)
} else {
scrollTop = 0
window.scrollTo(0, scrollTop)
}
}
字符串相关
检测是否为JSON字符串
export function isJSON (str) {
if (typeof str === 'string') {
try {
const obj = JSON.parse(str)
return !!(typeof obj === 'object' && obj)
} catch (e) {
return false
}
}
return false
}
验证指定的内容是否包含emoji表情符
export function emoji (str) {
return /[^\u0020-\u007E\u00A0-\u00BE\u2E80-\uA4CF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF\u0080-\u009F\u2000-\u201f\u2026\u2022\u20ac]/.test(str)
}
检测字符串是否是回文
export function isPalina (str) {
if (Object.prototype.toString.call(str) !== '[object String]') {
return false
}
let len = str.length
for (var i = 0; i < len / 2; i++) {
if (str[i] != str[len - 1 - i]) {
return false
}
}
return true
}
脱敏函数
export function desensitization (value, index = 3, length = 4, symbol = '*') {
if (value) {
value = value.toString().split('')
let _symbol = []
let i = length
while (i--) {_symbol.push(symbol)}
Array.prototype.splice.apply(value, [index, length, ..._symbol])
return value.join('')
} else {
return ''
}
}
查询字符串转对象
export function queryStringToObject (queryString) {
let a = queryString.split(/[&=]/g)
let result = {}
while (a.length) {
result[a.shift()] = a.shift()
}
return result
}
对象转查询字符串
export function objectToQueryString (object) {
let str = ''
for (let i in object) {
str = str + (str != '' ? '&' : '') + i + '=' + encodeURIComponent(object[i])
}
return str
}
过滤html代码(把<>转换)
export function filterTag(str) {
str = str.replace(/&/ig, '&')
str = str.replace(/</ig, '<')
str = str.replace(/>/ig, '>')
str = str.replace(' ', ' ')
return str
}
对象相关
检测是否为空对象({})
export function isEmptyObj (obj) {
if (typeof obj === 'object' && !Array.isArray(obj) && obj !== null) {
return Object.keys(obj).length === 0
}
return false
}
深度合并对象
export function deepMerge (obj1, obj2) {
for (let key in obj2) {
obj1[key] = (obj1[key] && isObj(obj1[key])) ? deepMerge(obj1[key], obj2[key]) : obj1[key] = obj2[key]
}
return obj1
}
深度拷贝
export function deepCopy (data) {
const t = typeOf(data)
let o
if (t === 'array') {
o = []
} else if (t === 'object') {
o = {}
} else {
return data
}
if (t === 'array') {
for (let i = 0; i < data.length; i++) {
o.push(deepCopy(data[i]))
}
} else if (t === 'object') {
for (let i in data) {
o[i] = deepCopy(data[i])
}
}
return o
}
时间相关
格式化时间函数
export function dateFtt (fmt, date) {
if (!date) {
return ''
} else if (/^\d{13}$/.test(date)) {
date = parseInt(date)
} else if (/^\d{10}$/.test(date)) {
date = parseInt(date) * 1000
} else if (isStr(date)) {
date = date.replace(/-/g, '/')
}
date = new Date(date)
var o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds(),
'S': date.getMilliseconds(),
'q+': Math.floor((date.getMonth() + 3) / 3)
}
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
}
for (var k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
}
}
return fmt
}
数组相关
判断两个数组完全相等
export function arrayEquals (a, b) {
if (a === b) return true
if (!(a instanceof Array)) return false
if (!(b instanceof Array)) return false
if (a.length !== b.length) return false
for (let i = 0; i !== a.length; ++i) {
if (a[i] !== b[i]) return false
}
return true
}
其他
export function numberToChinese (num) {
let AA = new Array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十')
let BB = new Array('', '十', '百', '仟', '萬', '億', '点', '')
let a = ('' + num).replace(/(^0*)/g, '').split('.')
let k = 0
let re = ''
for (let i = a[0].length - 1; i >= 0; i--) {
switch (k) {
case 0:
re = BB[7] + re
break
case 4:
if (!new RegExp('0{4}//d{' + (a[0].length - i - 1) + '}$').test(a[0])) {
re = BB[4] + re
}
break
case 8:
re = BB[5] + re
BB[7] = BB[5]
k = 0
break
}
if (k % 4 === 2 && a[0].charAt(i + 2) !== 0 && a[0].charAt(i + 1) === 0) {
re = AA[0] + re
}
if (a[0].charAt(i) !== 0) {
re = AA[a[0].charAt(i)] + BB[k % 4] + re
}
k++
}
if (a.length > 1) {
re += BB[6]
for (let i = 0; i < a[1].length; i++) {
re += AA[a[1].charAt(i)]
}
}
if (re === '一十') {
re = '十'
}
if (re.match(/^一/) && re.length === 3) {
re = re.replace('一', '')
}
return re
}
export function downLoadImg (imgSrc, name) {
let image = new Image()
image.setAttribute("crossOrigin", "anonymous")
image.onload = function() {
let canvas = document.createElement("canvas")
canvas.width = image.width
canvas.height = image.height
let context = canvas.getContext("2d")
context.drawImage(image, 0, 0, image.width, image.height)
let url = canvas.toDataURL("image/png")
let a = document.createElement("a")
let event = new MouseEvent("click")
a.download = name ? name + '.png' : "photo.png"
a.href = url
a.dispatchEvent(event)
}
image.src = imgSrc
}
export function downloadFile (res = { data: '', headers: {} }, fileName = '') {
let blob = new Blob([res.data])
fileName = fileName || res.headers['content-disposition'].split('=')[1]
let alink = document.createElement('a')
alink.download = decodeURIComponent(fileName)
alink.style.display = 'none'
alink.href = URL.createObjectURL(blob)
document.body.appendChild(alink)
alink.click()
URL.revokeObjectURL(alink.href)
document.body.removeChild(alink)
}
export function uuid (split = '-') {
let s = []
let hexDigits = '0123456789abcdef'
let num = split ? 36 : 32
for (let i = 0; i < num; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
}
s[14] = '4'
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1)
if (split) {
s[8] = s[13] = s[18] = s[23] = split
}
let uuid = s.join('')
return uuid
}
export function getScrollWidth () {
let outer = document.createElement('div')
outer.className = 'el-scrollbar__wrap'
outer.style.visibility = 'hidden'
outer.style.width = '100px'
outer.style.position = 'absolute'
outer.style.top = '-9999px'
document.body.appendChild(outer)
let widthNoScroll = outer.offsetWidth
outer.style.overflow = 'scroll'
let inner = document.createElement('div')
inner.style.width = '100%'
outer.appendChild(inner)
let widthWithScroll = inner.offsetWidth
outer.parentNode.removeChild(outer)
return widthNoScroll - widthWithScroll
}
export function print (printContainer) {
var iframe = document.createElement('iframe')
iframe.setAttribute('style', 'position: absolute; left: -99999px;')
document.body.appendChild(iframe)
var win = iframe.contentWindow || iframe.contentDocument
var doc = iframe.contentDocument || iframe.contentWindow.document
doc.body.onload = function () {
win.print()
}
var headHtml = document.head.innerHTML
doc.head.innerHTML = headHtml
doc.body.innerHTML = document.getElementById(printContainer).outerHTML
}
export function getQueryString (name) {
var url = document.location.toString()
var arrObj = url.split('?')
if (arrObj.length > 1) {
var arrPara = arrObj[1].split('&')
var arr
for (var i = 0; i < arrPara.length; i++) {
arr = arrPara[i].split('=')
if (arr != null && arr[0] === name) {
return decodeURIComponent(arr[1])
}
}
return ''
} else {
return ''
}
}
export function idCardNo (val) {
if (idCard(val)) {
let birthdayno, birthdaytemp, sexno
if (val.length === 18) {
birthdayno = val.substring(6, 14)
sexno = val.substring(16, 17)
} else if (val.length === 15) {
birthdaytemp = val.substring(6, 12)
birthdayno = '19' + birthdaytemp
sexno = val.substring(14, 15)
}
let tempid = sexno % 2
let sexName, sexCode
if (tempid === 0) {
sexName = '女'
sexCode = '2'
} else {
sexName = '男'
sexCode = '1'
}
let birthday = birthdayno.substring(0, 4) + '-' + birthdayno.substring(4, 6) + '-' + birthdayno.substring(6, 8)
let areaCode = val.substring(0, 6)
return {
birthday,
sexName,
sexCode,
age: jsGetAge(birthday),
nominalAge: getNominalAge(birthdayno),
areaCode
}
}
return false
}
export function isDevice () {
let u = navigator.userAgent
let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1
let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)
if (isAndroid) {
return 'android'
}
if (isIOS) {
return 'ios'
}
return 'web'
}
export function iosVersion () {
let u = navigator.userAgent.toLowerCase()
let v = u.match(/cpu iphone os (.*?) like mac os/)
return parseFloat(v[1].replace(/_/g, '.'))
}
export function idCard (idCard) {
idCard += ''
idCard = idCard.replace(/x/i, 'X')
if (/\*/.test(idCard)) {
return ((idCard.length === 15 || idCard.length === 18) && /^\d\*+[\dxX]$/.test(idCard))
} else {
let coefficient = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
let checkDigitMap = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
if (/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/.test(idCard)) {
if (idCard.length == 18) {
let sum = 0
for (let i = 0; i < 17; i++) {
sum += idCard[i] * coefficient[i]
}
return checkDigitMap[sum % 11] == idCard[17]
}
return true
} else {
return false
}
}
}
export let requestAnimFrame = (function () {
try {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function (callback) {
window.setTimeout(callback, 1000 / 60)
}
} catch (e) {}
})()
export let cancelAnimFrame = (function () {
try {
return window.cancelAnimationFrame ||
window.webkitCancelAnimationFrame ||
window.mozCancelAnimationFrame ||
function (id) {
window.clearTimeout(id)
}
} catch (e) {}
})()
export function keyboardIsOpen (callback = function () {}, recovery = false, type = 'all') {
let windowHeight = window.innerHeight
let flag = false
let position = 0
if (typeof callback == 'boolean') {
recovery = callback
callback = function () {}
}
function getScrollTop () {
let scrollTop = 0
if (document.documentElement && document.documentElement.scrollTop) {
scrollTop = document.documentElement.scrollTop
} else if (document.body) {
scrollTop = document.body.scrollTop
}
return scrollTop
}
function androidHandler () {
let oldWindowHeight = windowHeight
windowHeight = window.innerHeight
if (windowHeight < oldWindowHeight) {
flag = true
} else {
flag = false
}
callback && callback(flag)
}
function iosFocusinHandler (event) {
let tagName = event.target.tagName.toLowerCase()
if (tagName == 'input' || tagName == 'textarea' || event.target.isContentEditable) {
flag = true
if (recovery) {
position = getScrollTop()
}
callback && callback(flag)
}
}
function iosFocusoutHandler () {
flag = false
setTimeout(() => {
if (recovery) {
window.scrollTo(0, position)
}
callback && callback(flag)
}, 0)
}
function registerAndroidEvent() {
window.addEventListener('resize', androidHandler, false)
}
function registerIosEvent() {
document.body.addEventListener('focusin', iosFocusinHandler, false)
document.body.addEventListener('focusout', iosFocusoutHandler, false)
}
function destroyEventListener () {
window.removeEventListener('resize', androidHandler, false)
document.body.removeEventListener('focusin', iosFocusinHandler, false)
document.body.removeEventListener('focusout', iosFocusoutHandler, false)
}
destroyEventListener()
if (type == 'all') {
if (os() == 'android') {
registerAndroidEvent()
} else if (os() == 'ios') {
registerIosEvent()
}
} else if (os() == 'android' && type == 'android') {
registerAndroidEvent()
} else if (os() == 'ios' && type == 'ios') {
registerIosEvent()
}
return destroyEventListener
}