200 lines
6.1 KiB
JavaScript
Raw Normal View History

2024-11-05 22:43:34 +08:00
"use strict";
define(function (require, exports, module) {
return {
/**
*
*/
charSources: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_'.split(''),
/**
* 十进制 63进制
* @param val
* @constructor
*/
Parse10To63(val) {
if (val <= 10) {
return (val - 1) + "";
}
let sources = this.charSources;
let result = [];
let num = 0;
let mx = 63, baseMix = 63;
let tmp = 0;
while (val > 0) {
let mod = val % mx;
if (num === 0) {
tmp = mod - 1;
result.push(sources[tmp])
val = val - mod;
} else {
tmp = mod / (mx / baseMix);
result.push(sources[tmp - 1])
val = val - mod;
}
// 递增
num++;
mx = mx * baseMix;
//log
// console.log("mod: ", mod, " mx: ", mx, " val: ", val, " tmp: ", tmp)
}
return result.reverse().join('')
},
/**
* 生成UUID
* @param usn
* @param docType
* @returns {string}
* @constructor
*/
Uuid(usn, docType = 0) {
let sources = this.charSources;
let radix = sources.length;
let uuid = [];
let myCrypto = window.crypto;
//1. docIdPrefix长度3
let docIdPrefix = "";
if (myCrypto) {
//生成一个 8位的数组长度是 3
let num = new Uint8Array(3);
//随机生成
myCrypto.getRandomValues(num);
// console.log("Your lucky numbers:");
for (let i = 0; i < 3; i++) {
uuid[i] = sources[num[i] >> 2]
}
// docId + uid + docType + ts
docIdPrefix = uuid.join('');
} else {
// Compact form
for (let i = 0; i < 3; i++) uuid[i] = sources[0 | Math.random() * radix];
docIdPrefix = uuid.join('');
}
//2. 基于 2024-11-03 16:37:38 1730623058 最大长度可自增
let curTs4Sec = Date.parse(new Date()) / 1000 - 1730623058;
let tsStr = this.Parse10To63(curTs4Sec);
// console.log("curTs4Sec : ", curTs4Sec, " tsStr: ", tsStr)
// docId(长度固定3) + uid(长度固定6) + docType(长度固定1) + ts(短期内1-6)
return docIdPrefix + docType + usn + tsStr;
},
/**
* 阻止默认事件
* @constructor
*/
ProhibitDefaultEvent(event) {
event.preventDefault()
event.returnValue = false
},
/**
* 获取 触发事件的元素
* @param event
* @constructor
*/
GetEventTarget(event) {
return event.target
},
ParseEvent(e) {
return e || window.event //标准化事件处理
},
GetKeyCode(event) {
return event.keyCode || event.which || event.charCode
},
/**
* 当前选区 兼容不同浏览器
* @returns {Selection|*}
*/
GetSelection() {
return window.getSelection() || document.selection
},
/**
* 是否是数字
* @param value
* @returns {boolean}
*/
IsNum(value) {
return !isNaN(parseFloat(value)) && isFinite(value)
},
/**
* 在节点node后面插入新节点newNode
* @method InsertAfter
* @param { Node } node 目标节点
* @param { Node } newNode 新插入的节点 该节点将置于目标节点之后
* @return { Node } 新插入的节点
*/
InsertAfter(node, newNode) {
return node.nextSibling
? node.parentNode.insertBefore(newNode, node.nextSibling)
: node.parentNode.appendChild(newNode)
},
TriggerFocus(selector) {
const targetElement = document.querySelector(selector);
if (document.createEvent) {
const event = document.createEvent('HTMLEvents');
event.initEvent('focus', true, false);
targetElement.dispatchEvent(event);
} else if (document.createEventObject) {
//兼容IE
targetElement.fireEvent('focus');
}
2024-11-07 14:16:50 +08:00
},
/**
* 获取元素
* @param element
* @returns {string|string|*}
* @constructor
*/
GetText(element) {
2024-11-09 18:59:45 +08:00
if (element === null || element === undefined) {
return null
}
2024-11-07 14:16:50 +08:00
//textContent 性能 准确性更好
return element.textContent || element.innerText;
2024-11-10 22:57:28 +08:00
},
GetDpr() {
//获取屏幕像素密度
let dpr = window.devicePixelRatio || 1;//当前设置下 物理像素和虚拟像素的比值
if (!dpr) {
//devicePixelRatio这个属性是可以获取到设备的dpr
let devicePixelRatio = window?.devicePixelRatio;
//判断dpr是否为整数
let isRegularDpr = devicePixelRatio.toString().match(/^[1-9]\d*$/g)
if (isRegularDpr) {
// 对于是整数的dpr对dpr进行操作
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3;
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
dpr = 2;
} else {
dpr = 1;
}
} else {
// 其他设备下仍旧使用1倍的方案
dpr = 1;
}
}
return dpr;
2024-11-05 22:43:34 +08:00
}
2024-11-10 22:57:28 +08:00
2024-11-05 22:43:34 +08:00
}
});