Skip to content

Instantly share code, notes, and snippets.

@KiligFei
Created March 9, 2021 03:07
Show Gist options
  • Save KiligFei/891d7bb906d0986da62f1b3d7743017f to your computer and use it in GitHub Desktop.
Save KiligFei/891d7bb906d0986da62f1b3d7743017f to your computer and use it in GitHub Desktop.
[常用方法] 封装基本方法 #Javascript
import md5 from "js-md5";
var U = (function () {
var _logEnabled = false;
var log = function () {
if (!_logEnabled || !console || !console.log) {
}
};
var isLogEnabled = function () {
return _logEnabled;
};
var enableLog = function (enabled) {
_logEnabled = enabled;
};
var str = (function () {
var isNull = function (s) {
return typeof s === "undefined" || s === null;
};
var isNotNull = function (s) {
return !isNull(s);
};
var isEmpty = function (s) {
if (isNull(s)) {
return true;
}
if (typeof s != "string") {
return false;
}
return s.length == 0;
};
var isNotEmpty = function (s) {
return !isEmpty(s);
};
var isNumber = function (s) {
if (isEmpty(s)) {
return false;
}
return /^[0-9]*$/.test(s);
};
var startsWith = function (s, prefix) {
return s.indexOf(prefix) == 0;
};
var endsWith = function (str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
};
var replaceAll = function (s, s1, s2) {
if (isEmpty(s)) {
return "";
}
return s.replace(new RegExp(s1, "gm"), s2);
};
var trim = (s) => {
return s.replace(/^\s+|\s+$/gm, "");
};
let isUrl = (s) => {
if (isNotEmpty(s)) {
let reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/;
if (reg.test(s)) {
return true;
}
}
return false;
};
let randomString = (len) => {
let chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
let maxIndex = chars.length;
let s = "";
for (let i = 0; i < len; i++) {
s += chars.charAt(Math.floor(Math.random() * maxIndex));
}
return s;
};
let isChinaMobile = (mobile) => {
if (isNull(mobile)) {
return false;
}
if (mobile.indexOf("-") > 0) {
mobile = mobile.split("-")[1];
}
let cm_reg = /^(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
return cm_reg.test(mobile);
};
let isTel = (tel) => {
let reg = /^([0-9]{3,4}-)?[0-9]{7,8}$/;
return reg.test(tel);
};
let trimChinaMobile = (mobile) => {
if (mobile) {
if (mobile.indexOf("-") > -1 && mobile.indexOf("86-") > -1) {
return mobile.split("-")[1];
}
return mobile;
}
return "";
};
let rn2br = (str) => {
return str.replace(/(\r\n)|(\n)/g, "<br>");
};
let num2Chinese = (num) => {
let chnNumChar = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
let chnUnitChar = ["", "十", "百", "千"];
let strIns = "",
chnStr = "";
let unitPos = 0;
let zero = true;
while (num > 0) {
let v = num % 10;
if (v === 0) {
if (!zero) {
zero = true;
chnStr = chnNumChar[v] + chnStr;
}
} else {
zero = false;
strIns = chnNumChar[v];
strIns += chnUnitChar[unitPos];
chnStr = strIns + chnStr;
}
unitPos++;
num = Math.floor(num / 10);
}
chnStr = replaceAll(chnStr, "一十", "十");
return chnStr;
};
return {
isNull,
isNotNull,
isEmpty,
isNotEmpty,
startsWith,
endsWith,
replaceAll,
trim,
rn2br,
isTel,
isChinaMobile,
isUrl,
randomString,
isNumber,
trimChinaMobile,
num2Chinese,
};
})();
var date = (function () {
var pad = function (n) {
return n < 10 ? "0" + n : n;
};
var inAnHour = function (date) {
var mins = parseInt((Math.floor(new Date()) - Math.floor(new Date(date))) / (1000 * 60));
if (mins > -60) {
return true;
}
return false;
};
var in24Hour = function (date) {
var mins = parseInt((Math.floor(new Date()) - Math.floor(new Date(date))) / (1000 * 60));
if (mins > -1440) {
return true;
}
return false;
};
var countdownTimers = function (date) {
var timers = [0, 0, 0, 0];
var time = parseInt(Math.floor(new Date(date) - Math.floor(new Date())) / 1000 / 60);
var mins = parseInt(time / 60);
if (mins < 10) {
timers[0] = 0;
timers[1] = mins;
} else {
timers[0] = parseInt(mins / 10);
timers[1] = parseInt(mins % 10);
}
var seconds = time % 60;
if (seconds < 10) {
timers[2] = 0;
timers[3] = seconds;
} else {
timers[2] = parseInt(seconds / 10);
timers[3] = parseInt(seconds % 10);
}
return timers;
};
var foreshowTimeout = function (timers) {
if (timers[0] === 0 && timers[1] === 0 && timers[2] === 0 && timers[3] === 0) {
return true;
}
return false;
};
var foreshowTimeouted = function (timers) {
if (timers[0] <= 0 && timers[1] <= 0 && timers[2] <= 0 && timers[3] <= 0) {
return true;
}
return false;
};
var seconds2HMS = function (time) {
let h = 0,
m = 0,
s = 0,
_h,
_m,
_s,
ret = "";
h = Math.floor(time / 3600);
time = Math.floor(time % 3600);
m = Math.floor(time / 60);
s = Math.floor(time % 60);
if (h > 0) {
_h = h < 10 ? "0" + h : h;
ret += _h + ":";
}
_s = s < 10 ? "0" + s : s;
_m = m < 10 ? "0" + m : m;
ret += _m + ":" + _s;
return ret;
};
var format = function (date, fmt) {
if (!date || !fmt) {
return null;
}
var o = {
"M+": date.getMonth() + 1, // 月份
"d+": date.getDate(), // 日
"h+": date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 小时
"H+": date.getHours(), // 小时
"m+": date.getMinutes(), // 分
"s+": date.getSeconds(), // 秒
"q+": Math.floor((date.getMonth() + 3) / 3), // 季度
S: date.getMilliseconds(),
};
var week = {
0: "\u65e5",
1: "\u4e00",
2: "\u4e8c",
3: "\u4e09",
4: "\u56db",
5: "\u4e94",
6: "\u516d",
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
}
if (/(E+)/.test(fmt)) {
fmt = fmt.replace(
RegExp.$1,
(RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : "") +
week[date.getDay() + ""]
);
}
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;
};
var formatISO8601 = function (d) {
if (!d) {
return null;
}
return (
d.getUTCFullYear() +
"-" +
pad(d.getUTCMonth() + 1) +
"-" +
pad(d.getUTCDate()) +
"T" +
pad(d.getUTCHours()) +
":" +
pad(d.getUTCMinutes()) +
":" +
pad(d.getUTCSeconds()) +
"Z"
);
};
var getInt = function (s) {
var offset = 0;
for (var i = 0; i < s.length; i++) {
if (s.charAt(i) == "0") {
continue;
}
offset = i;
break;
}
if (offset == 0) {
return parseInt(s);
}
return parseInt(s.substr(offset));
};
var parse = function (v, timezoneOffset) {
if (!v) {
return null;
}
if (!isNaN(v)) {
return new Date(v);
}
// yyyy-MM-ddTHH:mm:ssZ
// yyyy-MM-ddTHH:mm:ss.SSSZ
// yyyy-MM-dd HH:mm:ss.SSS
var index = 0;
var year = getInt(v.substr(index, 4));
index += 5;
var month = getInt(v.substr(index, 2)) - 1;
index += 3;
var day = getInt(v.substr(index, 2));
index += 3;
var hour = index >= v.length ? 0 : getInt(v.substr(index, 2));
index += 3;
var minute = index >= v.length ? 0 : getInt(v.substr(index, 2));
index += 3;
var second = index >= v.length ? 0 : getInt(v.substr(index, 2));
// TODO more format
if (v.charAt(v.length - 1) == "Z") {
var millSecond = v.indexOf(".") > 0 ? getInt(v.substring(v.indexOf(".") + 1, v.length - 1)) : 0;
var d = new Date();
d.setUTCFullYear(year);
d.setUTCMonth(month);
d.setUTCDate(day);
d.setUTCHours(hour);
d.setUTCMinutes(minute);
d.setUTCSeconds(second);
d.setUTCMilliseconds(millSecond);
return d;
} else {
var millSecond = v.indexOf(".") > 0 ? getInt(v.substring(v.indexOf(".") + 1)) : 0;
var date = new Date(year, month, day, hour, minute, second, millSecond);
if (!str.isNull(timezoneOffset)) {
var diff = timezoneOffset - date.getTimezoneOffset();
date.setTime(date.getTime() - diff * 60 * 1000);
}
return date;
}
};
var parseDate = function (v) {
//yyyyMMdd
if (!v) {
return null;
}
v = v.toString();
var index = 0;
var year = getInt(v.substr(index, 4));
index += 4;
var month = getInt(v.substr(index, 2)) - 1;
index += 2;
var day = getInt(v.substr(index, 2));
var d = new Date();
d.setFullYear(year);
d.setMonth(month);
d.setDate(day);
return d;
};
let isToday = function (date) {
let d = U.date.format(U.date.parse(date), "yyyy-MM-dd");
let today = U.date.format(new Date(), "yyyy-MM-dd");
return d === today;
};
let getPastDate = (past) => {
let dd = new Date();
dd.setDate(dd.getDate() + past); //获取AddDayCount天后的日期
let y = dd.getFullYear();
let m = dd.getMonth() + 1 < 10 ? "0" + (dd.getMonth() + 1) : dd.getMonth() + 1; //获取当前月份的日期,不足10补0
let d = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate(); //获取当前几号,不足10补0
return y + "-" + m + "-" + d;
};
let daysBetween = (since, until) => {
let OneMonth = since.substring(5, since.lastIndexOf("-"));
let OneDay = since.substring(since.length, since.lastIndexOf("-") + 1);
let OneYear = since.substring(0, since.indexOf("-"));
let TwoMonth = until.substring(5, until.lastIndexOf("-"));
let TwoDay = until.substring(until.length, until.lastIndexOf("-") + 1);
let TwoYear = until.substring(0, until.indexOf("-"));
let cha =
(Date.parse(OneMonth + "/" + OneDay + "/" + OneYear) -
Date.parse(TwoMonth + "/" + TwoDay + "/" + TwoYear)) /
86400000;
return Math.abs(cha);
};
let period2Str = (period, options) => {
let units = {
I: "分钟",
H: "小时",
D: "天",
W: "周",
M: "个月",
Y: "年",
};
if (str.isEmpty(period) || period.length < 2) {
return (options && options.defaultStr) || "--";
} else {
let length = period.length;
let unit = period.substring(length - 1);
let num = parseInt(period.substring(0, length - 1));
if (period === "1S") {
return "无";
} else if (num === 0) {
return "永久";
} else {
let prefix = (options && options.prefix) || "";
return prefix + num + units[unit];
}
}
};
return {
parse: parse,
inAnHour: inAnHour,
in24Hour: in24Hour,
seconds2HMS: seconds2HMS,
countdownTimers: countdownTimers,
foreshowTimeout: foreshowTimeout,
foreshowTimeouted: foreshowTimeouted,
format: format,
isToday,
formatISO8601: formatISO8601,
getDayOfYear: function (date) {
var start = new Date(date.getFullYear(), 0, 0);
var diff = date.getTime() - start.getTime();
var oneDay = 1000 * 60 * 60 * 24;
return Math.floor(diff / oneDay);
},
daysBetween,
getPastDate,
parseDate,
period2Str,
};
})();
let array = (function () {
let swap = function (arr, index1, index2) {
arr[index1] = arr.splice(index2, 1, arr[index1])[0];
return arr;
};
let remove = function (arr, index) {
if (isNaN(index) || index > arr.length) {
return [];
}
arr.splice(index, 1);
return arr;
};
let insert = function (arr, index, item) {
arr.splice(index, 0, item);
return arr;
};
let insertLast = function (arr, item) {
arr.splice(arr.length, 0, item);
return arr;
};
return {
swap,
remove,
insert,
insertLast,
};
})();
var getHashParameter = function (name) {
var hash = window.location.hash;
if (!hash) {
return null;
}
var offset = hash.indexOf("?");
if (offset < 0) {
return null;
}
hash = hash.substr(offset + 1);
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = hash.match(reg);
if (r == null) {
return null;
}
return unescape(r[2]);
};
var getParameter = function (name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) {
return unescape(r[2]);
}
return null;
};
var getVisitNumber = function (num) {
let val = parseInt(num);
if (val < 1000) {
return val;
}
if (val > 1000 && val < 10000) {
return ">" + val;
}
if (val > 10000) {
return ">1万";
}
};
var getParameters = function () {
var params = {};
var loc = window.location;
if (loc.search) {
var query = loc.search.substr(1);
var queries = query.split("&");
queries.forEach(function (q) {
var kv = q.split("=");
params[kv[0]] = U.str.isEmpty(kv[1]) ? "" : decodeURIComponent(kv[1]);
});
}
return params;
};
var getDomainFromUrl = function (url) {
var offset = url.indexOf("//");
var offset2 = url.indexOf("/", offset + 2);
if (offset2 == -1) {
return url.substring(offset + 2);
}
return url.substring(offset + 2, offset2);
};
var countryCode = [
{
code: "86",
name: "中国",
},
{
code: "852",
name: "香港",
},
{
code: "853",
name: "澳门",
},
{
code: "886",
name: "台湾",
},
{
code: "65",
name: "新加坡",
},
{
code: "66",
name: "泰国",
},
{
code: "1",
name: "美国",
},
{
code: "60",
name: "马来西亚",
},
];
var convertBigDecimal = function (num) {
if (num > 10000) {
return (num / 10000).toFixed(1) + "万";
}
return num;
};
let toFixed = (num, s) => {
if (!(num.toString() === "-" || num.toString() === "+")) {
let times = Math.pow(10, s);
let offset = num > 0 ? 0.5 : -0.5;
let des = num * times + offset;
des = parseInt(des, 10) / times;
return des + "";
}
return num;
};
var isIOS = function () {
let u = navigator.userAgent;
var isIOS = /(iPhone|iPad|iPod|iOS)/i.test(u);
return isIOS;
};
var formatCurrency = function (s, n) {
if (s) {
/*
* 参数说明:
* s:要格式化的数字
* n:保留几位小数
* */
n = n > 0 && n <= 20 ? n : 2;
s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
var l = s.split(".")[0].split("").reverse(),
r = s.split(".")[1];
let t = "";
for (let i = 0; i < l.length; i++) {
t += l[i] + ((i + 1) % 3 == 0 && i + 1 != l.length ? "," : "");
}
return t.split("").reverse().join("") + "." + r;
} else {
return 0;
}
};
let htmlstr = (() => {
let components2pureHtml = (cs) => {
let html = "";
cs.map((c, index) => {
if (c.type === 1) {
if (c.text.length > 0) {
let text = c.text;
text = text.replace(/<[^>]+>/g, "");
text = text.replace(/\r\n/g, "<br/>");
text = text.replace(/\n/g, "<br/>");
text = text.replace(/\s/g, "&nbsp;");
html += "<p>" + text + "</p>";
}
} else {
if (c.url !== "") {
html += '<img src="' + c.url + '"/>';
}
}
});
return html;
};
let html2components = (html) => {
let div = document.createElement("div");
div.innerHTML = html;
let nodes = div.childNodes;
let cs = [];
for (let i = 0; i < nodes.length; i++) {
let n = nodes[i];
let name = n.nodeName.toLowerCase();
if (name === "p") {
let html = n.innerHTML.toLowerCase();
html = html.replace(/(<br\/>|<br>)/g, "\r\n");
html = html.replace(/&nbsp;/g, " ");
cs.push({
type: 1,
text: html,
});
} else if (name === "img") {
cs.push({
type: 2,
url: n.src,
});
}
}
return cs;
};
let html2dom = (html) => {
let dom = document.createElement("div");
dom.innerHTML = html;
return dom;
};
let html2nodes = (html) => {
let div = document.createElement("div");
div.innerHTML = html;
let nodes = div.childNodes;
return nodes;
};
return {
components2pureHtml,
html2components,
html2nodes,
html2dom,
};
})();
let base64 = (() => {
let seed = 0;
let toFile = function (dataURL) {
var arr = dataURL.split(","),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var offset = mime.indexOf("/");
var suffix = offset > 0 ? mime.substring(offset + 1) : null;
const uid = `${+new Date()}-${seed++}`;
var fileName = suffix ? `${uid}.` + suffix : `${uid}`;
return new File([u8arr], fileName, { type: mime });
};
return { toFile };
})();
let debounce = function (func, wait, immediate) {
let timeout,
args,
context,
timestamp,
result,
time = 0;
let later = function () {
// 据上一次触发时间间隔
let last = new Date().getTime() - timestamp;
// 上次被包装函数被调用时间间隔last小于设定时间间隔wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
if (!timeout) {
context = args = null;
}
}
}
};
return function () {
context = this;
args = arguments;
timestamp = new Date().getTime();
let callNow = immediate && !timeout;
// 如果延时不存在,重新设定延时
if (!timeout) {
timeout = setTimeout(later, wait);
}
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
};
let pageUtils = (() => {
let detectZoom = () => {
let ratio = 0,
screen = window.screen,
ua = navigator.userAgent.toLowerCase();
if (window.devicePixelRatio !== undefined) {
ratio = window.devicePixelRatio;
} else if (~ua.indexOf("msie")) {
if (screen.deviceXDPI && screen.logicalXDPI) {
ratio = screen.deviceXDPI / screen.logicalXDPI;
}
} else if (window.outerWidth !== undefined && window.innerWidth !== undefined) {
ratio = window.outerWidth / window.innerWidth;
}
if (ratio) {
ratio = Math.round(ratio * 100);
}
// let platform = navigator.platform;
// let isMac = (platform === 'Mac68K') || (platform === 'MacPPC') || (platform === 'Macintosh') || (platform === 'MacIntel');
// if (!(ratio === 100 || (isMac && ratio === 200))) {
// Modal.warning({
// title: '提示',
// content: '为了您的体验效果,请不要缩放页面',
// });
// }
return ratio;
};
return { detectZoom };
})();
let ensureValue = function (v, defaultValue) {
if (typeof v === "undefined" || v === null) {
return defaultValue;
}
return v;
};
var obj = {
copy: function copy(obj) {
var newobj = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) {
newobj[attr] = obj[attr];
}
}
return newobj;
},
deepCopy: function (_obj) {
if (typeof _obj != "object") {
return _obj;
}
var newobj = {};
for (var attr in _obj) {
newobj[attr] = obj.deepCopy(_obj[attr]);
}
return newobj;
},
};
function getValueFromEvent(e) {
// To support custom element
if (!e || !e.target) {
return e;
}
const { target } = e;
if (target.type === "checkbox") {
return target.checked ? 1 : 0;
}
return target.value;
}
let genCheckCode = (mobile) => {
let t = new Date().getTime().toString();
let p = "web";
let d = genUUID();
let v = md5(t.length + t + p.length + p + d.length + d + mobile);
return {
t,
p,
d,
v,
};
};
let genUUID = () => {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
let ret = s.join("");
ret = str.replaceAll(ret, "-", "");
return ret;
};
var serializeParameters = (params) => {
var dataStr = "";
if (!params) {
return dataStr;
}
for (var key in params) {
if (dataStr.length > 0) {
dataStr += "&";
}
var value = params[key];
if (value === undefined || value === null) {
value = "";
}
dataStr += `${key}=${encodeURIComponent(value)}`;
}
return dataStr;
};
return {
getValueFromEvent: getValueFromEvent,
val: ensureValue,
htmlstr,
log: log,
isLogEnabled: isLogEnabled,
enableLog: enableLog,
str: str,
date: date,
debounce,
array,
getParameter: getParameter,
getHashParameter: getHashParameter,
getVisitNumber: getVisitNumber,
getDomainFromUrl: getDomainFromUrl,
countryCode: countryCode,
convertBigDecimal: convertBigDecimal,
isIOS: isIOS,
formatCurrency,
base64,
pageUtils,
toFixed,
obj,
genCheckCode,
getParameters,
serializeParameters,
};
})();
export default U;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment