写了一些单个的小页面可以引入的常用js方法,省了自己手写的时间,需要时可以保存为js文件然后直接引用。
const jsToolsH5 = {
/**
* 获取url的查询参数
* @param {string} param - 需要获取的参数名称
* @returns {string} - 返回值是一个字符串
*/
getUrlParam: (param) => {
if (!param || typeof param !== 'string') {
return ''
} else {
try {
const reg = new RegExp('(^|&)' + param + '=([^&]*)(&|$)', 'i')
const character = decodeURIComponent(window.location.search.substring(1)).match(reg)
if (!!character && character.length > 0 && !!character[2] && character[2] != 'null') {
return character[2]
} else {
return ''
}
} catch (error) {
throw new Error('URL Param Error')
}
}
},
/**
* 把一个对象拼接成字符串
* @param {object} paramsObject - 需要拼接在url后边的对象
* @returns {string} - 返回值是一个字符串
*/
convertObjectToString: (paramsObject) => {
if (!!paramsObject && paramsObject.constructor === Object && Object.keys(paramsObject).length > 0) {
let _str = ''
_str = Object.keys(paramsObject).reduce((prev, current, currentIndex, array) => {
if (currentIndex === array.length - 1) {
return prev + current + '=' + paramsObject[current]
} else {
return prev + current + '=' + paramsObject[current] + '&'
}
}, '')
return _str
} else {
throw new Error('Not a Object Type')
}
},
/**
* 原生JS发送http请求
* @param {object} params - 传入的对象
* @param {string} params.url - 传入对象的 url 属性,可以直接把查询参数拼接在url后边
* @param {string} [params.type = 'GET'] - 传入对象的 type 属性
* @param {*} [params.data] - 传入对象的 data 属性可以是json对象或Qs序列化之后的查询字符串等
* @param {string} [params.contentType] - 传入对象的 contentType 属性: application/json 或者 application/x-www-form-urlencoded
* @param {object} [params.header] - 其他需要添加到header里的参数
* @returns {promise} - 返回值是一个promise对象,需要用.then接收
*/
ajaxPromise: (params) => {
return new Promise((resolve, reject) => {
const _contentType = params && params.contentType ? params.contentType : 'application/json'
const _data = params && params.data ? params.data : null
const _type = params && params.type ? params.type : 'GET'
if (_contentType === 'application/x-www-form-urlencoded' && !!_data) {
let _reg = /^\S+=\S+/g
if (!_reg.test(params.data)) {
throw new Error('请先使用Qs序列化Data')
}
}
const xhr = new XMLHttpRequest()
xhr.open(_type, params.url)
xhr.setRequestHeader('Content-type', _contentType)
if (!!params.header) {
for (const key in params.header) {
const _val = params['header'][key]
xhr.setRequestHeader(key, _val)
}
}
xhr.send(_data)
xhr.onload = () => {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.responseText))
} else {
reject(Error(xhr.statusText))
}
}
})
},
/**
* 判断当前浏览器是否为移动端
* @returns {boolean} 返回值是布尔值true/false
*/
isMobile: () => {
if (window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)) {
// 移动端
return true
} else {
if (window.navigator.userAgent.match(/(Macintosh)/i) && window.navigator.maxTouchPoints >= 1) {
// iPad
return true
} else {
// PC
return false
}
}
},
/**
* 判断当前浏览器是否为Android
* @returns {boolean} 返回值是true/false
*/
isAndroid: () => {
const _ua = window.navigator.userAgent
if (_ua.indexOf('Android') > -1 || _ua.indexOf('Linux') > -1) {
return true
} else {
return false
}
},
/**
* 判断当前浏览器是否为iOS
* @returns {boolean} 返回值是true/false
*/
isIos: () => {
const _ua = window.navigator.userAgent
if (!!_ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) || !!_ua.match(/Macintosh.+Mac OS X/)) {
return true
} else {
return false
}
},
/**
* 判断当前浏览器是否为微信
* @returns {boolean} 返回值是true/false
*/
isWeixin: () => {
const _ua = window.navigator.userAgent
if (_ua.indexOf('MicroMessenger') > -1) {
return true
} else {
return false
}
},
/**
* 根据当前窗口大小改变html根字体大小
* 可以在页面初始化之后和窗口大小改变时调用此方法
* window.addEventListener('load', () => jsToolsH5.resizeFont())
* window.addEventListener('resize', () => jsToolsH5.resizeFont())
*/
resizeFont: () => {
const _windowWidth = document.documentElement.clientWidth > 750 ? 750 : document.documentElement.clientWidth
document.documentElement.style.fontSize = (_windowWidth / 750) * 100 + 'px'
},
/**
* 格式化毫秒数,换算成天时分秒
* @param {number} milliseconds - 需要格式化的毫秒数
* @returns {object} - 返回值是一个对象,里面有seconds、minutes、hours、days
*/
millisecondFormat: (milliseconds) => {
const _timeObj = {
days: 0,
hours: 0,
minutes: 0,
seconds: 0,
}
if (!!milliseconds) {
_timeObj.days = Math.floor(milliseconds / (1000 * 60 * 60 * 24))
_timeObj.hours = Math.floor((milliseconds % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
_timeObj.minutes = Math.floor((milliseconds % (1000 * 60 * 60)) / (1000 * 60))
_timeObj.seconds = Math.floor((milliseconds % (1000 * 60)) / 1000)
}
return _timeObj
},
}