200 lines
4.9 KiB
JavaScript
200 lines
4.9 KiB
JavaScript
/**
|
||
* 判断传入的值是否为空
|
||
* @param {*} val
|
||
* @returns
|
||
*/
|
||
export function isNull(val) {
|
||
if (typeof val == "boolean") {
|
||
return false;
|
||
}
|
||
if (typeof val == "number") {
|
||
return false;
|
||
}
|
||
if (val instanceof Array) {
|
||
if (val.length == 0) return true;
|
||
} else if (val instanceof Object) {
|
||
if (JSON.stringify(val) === "{}") return true;
|
||
} else {
|
||
if (
|
||
val == "null" ||
|
||
val == null ||
|
||
val == "undefined" ||
|
||
val == undefined ||
|
||
val == ""
|
||
)
|
||
return true;
|
||
return false;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 不为空
|
||
export function isDef(val) {
|
||
return val !== undefined && val !== null;
|
||
}
|
||
|
||
// 是否是一个数字
|
||
export function isNumeric(val) {
|
||
return /^\d+(\.\d+)?$/.test(val);
|
||
}
|
||
|
||
// 是一个对象
|
||
export function isObject(val) {
|
||
return Object.prototype.toString.call(val) === "[object Object]"
|
||
}
|
||
|
||
// 是一个字符串
|
||
export function isString(val) {
|
||
return Object.prototype.toString.call(val) === "[object String]"
|
||
}
|
||
|
||
|
||
|
||
|
||
// 添加单位
|
||
export function addUnit(value) {
|
||
if (!isDef(value)) {
|
||
return undefined;
|
||
}
|
||
|
||
value = String(value);
|
||
return isNumeric(value) ? `${value}px` : value;
|
||
}
|
||
|
||
// 获得角度
|
||
export function getAngle(angx, angy) {
|
||
return Math.atan2(angy, angx) * 180 / Math.PI;
|
||
};
|
||
|
||
// 根据起点终点返回方向 1向上 2向下 3向左 4向右 0未滑动
|
||
export function getDirection(startx, starty, endx, endy) {
|
||
var angx = endx - startx;
|
||
var angy = endy - starty;
|
||
var result = 0;
|
||
|
||
// 如果滑动距离太短
|
||
if (Math.abs(angx) < 5 && Math.abs(angy) < 5) {
|
||
return result;
|
||
}
|
||
|
||
var angle = getAngle(angx, angy);
|
||
if (angle >= -160 && angle <= -20) {
|
||
result = 1;
|
||
} else if (angle > 20 && angle < 160) {
|
||
result = 2;
|
||
} else if ((angle >= 160 && angle <= 180) || (angle >= -180 && angle < -160)) {
|
||
result = 3;
|
||
} else if (angle >= -20 && angle <= 20) {
|
||
result = 4;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
export function friendlyDate(timestamp) {
|
||
var formats = {
|
||
'year': '%n% 年前',
|
||
'month': '%n% 月前',
|
||
'day': '%n% 天前',
|
||
'hour': '%n% 小时前',
|
||
'minute': '%n% 分钟前',
|
||
'second': '%n% 秒前',
|
||
};
|
||
|
||
var now = Date.now();
|
||
var seconds = Math.floor((now - timestamp) / 1000);
|
||
var minutes = Math.floor(seconds / 60);
|
||
var hours = Math.floor(minutes / 60);
|
||
var days = Math.floor(hours / 24);
|
||
var months = Math.floor(days / 30);
|
||
var years = Math.floor(months / 12);
|
||
|
||
var diffType = '';
|
||
var diffValue = 0;
|
||
if (years > 0) {
|
||
diffType = 'year';
|
||
diffValue = years;
|
||
} else {
|
||
if (months > 0) {
|
||
diffType = 'month';
|
||
diffValue = months;
|
||
} else {
|
||
if (days > 0) {
|
||
diffType = 'day';
|
||
diffValue = days;
|
||
} else {
|
||
if (hours > 0) {
|
||
diffType = 'hour';
|
||
diffValue = hours;
|
||
} else {
|
||
if (minutes > 0) {
|
||
diffType = 'minute';
|
||
diffValue = minutes;
|
||
} else {
|
||
diffType = 'second';
|
||
diffValue = seconds === 0 ? (seconds = 1) : seconds;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return formats[diffType].replace('%n%', diffValue);
|
||
}
|
||
|
||
// 获取元素的节点信息
|
||
export function getRect(selector, vm) {
|
||
return new Promise((resolve, reject) => {
|
||
if (!selector) reject('Parameter is empty');
|
||
let query = null;
|
||
// #ifdef MP-ALIPAY
|
||
query = uni.createSelectorQuery();
|
||
// #endif
|
||
// #ifndef MP-ALIPAY
|
||
query = uni.createSelectorQuery().in(vm);
|
||
// #endif
|
||
query.select(selector).boundingClientRect()
|
||
query.exec(data => resolve(Array.isArray(data) ? data[0] : data));
|
||
})
|
||
}
|
||
|
||
|
||
// 获取头部区域高度(状态栏+标签栏)
|
||
export function getHeaderHeight() {
|
||
// 微信小程序 7.0+、百度小程序、H5、App(2.0.3+)支持navigationStyle设为custom,取消默认的原生导航栏
|
||
const info = uni.getSystemInfoSync();
|
||
let navHeight = 0;
|
||
// console.log("info:", JSON.stringify(info));
|
||
|
||
// App、微信小程序、支付宝小程序、百度小程序、抖音小程序、QQ小程序、快手小程序、京东小程序
|
||
// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ || MP-KUAISHOU || MP-JD
|
||
const btnInfo = uni.getMenuButtonBoundingClientRect()
|
||
// #endif
|
||
|
||
// 微信/百度/快手/字节跳动/京东小程序
|
||
// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-KUAISHOU || MP-TOUTIAO || MP-JD
|
||
// console.log("btnInfo:", JSON.stringify(btnInfo), info?.statusBarHeight);
|
||
navHeight = btnInfo?.bottom + btnInfo?.top - info?.statusBarHeight;
|
||
// #endif
|
||
|
||
// APP
|
||
// #ifdef APP-PLUS
|
||
navHeight = (info?.statusBarHeight || 0) + 45
|
||
// #endif
|
||
|
||
// 支付宝小程序导航栏不支持自定义,但是可以通过改变透明度,使其隐藏,且不占据文档流
|
||
// 支付宝的titleBarHeight为标题栏高度,statusBarHeight为状态栏高度
|
||
// #ifdef MP-ALIPAY
|
||
navHeight = info?.titleBarHeight + info?.statusBarHeight;
|
||
// #endif
|
||
|
||
// QQ在开发者工具中测试是根据top+buttom才能正确计算出高度
|
||
// #ifdef MP-QQ
|
||
navHeight = btnInfo?.bottom + btnInfo?.top;
|
||
// #endif
|
||
|
||
// 飞书
|
||
// #ifdef MP-LARK
|
||
navHeight = info?.navigationBarSafeArea?.height + info?.navigationBarSafeArea?.top;
|
||
// #endif
|
||
return { navHeight }
|
||
} |