//轉化為dd-MM-yyyy HH:mm:ss
export const dateReurn1 = (date1) = >{
? ? date1.toLocaleString("en-US", {hour12: false}).replace(/\b\d\b/g, '0$&').replace(new RegExp('/', 'gm'), '-')
}
//獲取當前的時間yyyy-MM-dd HH:mm:ss,沒有滿10就補0
export default const obtainDate = () = >{
? ? ? ? let date = new Date();
? ? ? ? let year = date.getFullYear();
? ? ? ? let month = date.getMonth() + 1;
? ? ? ? let day = date.getDate();
? ? ? ? let hours = date.getHours();
? ? ? ? let minu = date.getMinutes();
? ? ? ? let second = date.getSeconds();
? ? ? ? //判斷是否滿10
? ? ? ? let arr = [month, day, hours, minu, second];
? ? ? ? arr.forEach(item = >{
? ? ? ? ? ? item < 10 ? "0" + item: item;
? ? ? ? })
? ? ? ? console.log(year + '-' + arr[0] + '-' + arr[1] + ' ' + arr[2] + ':' + arr[3] + ':' + arr[4])
? ? }
//檢測是否是數組
export default? const judgeArr = (arr) = >{
? ? if (Array.isArray(arr)) {
? ? ? ? return true;
? ? }
}
//.set去重代碼
export? const changeReArr = (arr) = >{
? ? return? Array.from(new Set([1, 2, 2, 3, 5, 4, 5]))
? ? //利用set將[1,2,2,3,5,4,5]轉化成set數據,利用array from將set轉化成數組類型
}
//純數組排序
export? const orderArr = (arr) = >{
? ? arr.sort((a, b) = >{
? ? ? ? return a - b
? ? ? ? //將arr升序排列,如果是倒序return -(a-b)
? ? })
}
//數組對象排序
export? const orderArr = (arr) = >{
? ? arr.sort((a, b) = >{
? ? ? ? let value1 = a[property];
? ? ? ? let value2 = b[property];
? ? ? ? return value1 - value2;
? ? ? ? //sort方法接收一個函數作為參數,這里嵌套一層函數用
? ? ? ? //來接收對象屬性名,其他部分代碼與正常使用sort方法相同
? ? })
}
//promise
export? const promiseDemo = () = >{
? ? new Promise((resolve, reject) = >{
? ? ? ? resolve(() = >{
? ? ? ? ? ? let a = 1;
? ? ? ? ? ? return++a;
? ? ? ? }).then((data) = >{
? ? ? ? ? ? console.log(data)
? ? ? ? ? ? //data值為++a的值
? ? ? ? }).
? ? ? ? catch(() = >{
? ? ? ? ? ? //錯誤執行這個
? ? ? ? })
? ? })
}
/**
*
* @desc 判斷兩個數組是否相等
* @param {Array} arr1
* @param {Array} arr2
* @return {Boolean}
*/
function arrayEqual(arr1, arr2) {
? ? if (arr1 === arr2)
? ? ? ? return true;
? ? if (arr1.length != arr2.length)
? ? ? ? return false;
? ? for (var i = 0; i < arr1.length; ++i) {
? ? ? ? if (arr1[i] !== arr2[i])
? ? ? ? ? ? return false;
? ? }
? ? return? true;
}
/**
*
* @desc 判斷元素是否有某個class
* @param {HTMLElement} ele
* @param {String} cls
* @return {Boolean}
*/
function hasClass(ele, cls) {
? ? return (new RegExp('(\\s|^)' + cls + '(\\s|$)')).test(ele.className);
}
/**
*
* @desc? 為元素添加class
* @param? {HTMLElement} ele
* @param? {String} cls
*/
var hasClass = require('./hasClass');
function addClass(ele, cls) {
? ? if (!hasClass(ele, cls)) {
? ? ? ? ele.className += ' ' + cls;
? ? }
}
/**
*
* @desc 為元素移除class
* @param {HTMLElement} ele
* @param {String} cls
*/
var hasClass = require('./hasClass');
function removeClass(ele, cls) {
? ? if (hasClass(ele, cls)) {
? ? ? ? var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
? ? ? ? ele.className = ele.className.replace(reg, ' ');
? ? }
}
/**
*
* @desc 根據name讀取cookie
* @param? {String} name
* @return {String}
*/
function getCookie(name) {
? ? var arr = document.cookie.replace(/\s/g, "").split(';');
? ? for (var i = 0; i < arr.length; i++) {
? ? ? ? var tempArr = arr[i].split('=');
? ? ? ? if (tempArr[0] == name) {
? ? ? ? ? ? return decodeURIComponent(tempArr[1]);
? ? ? ? }
? ? }
? ? return? '';
}
var setCookie = require('./setCookie');
/**
*
* @desc 根據name刪除cookie
* @param? {String} name
*/
function removeCookie(name) {
? ? // 設置已過期,系統會立刻刪除cookie
? ? setCookie(name, '1', -1);
}
/**
*
* @desc? 設置Cookie
* @param {String} name
* @param {String} value
* @param {Number} days
*/
function setCookie(name, value, days) {
? ? var date = new Date();
? ? date.setDate(date.getDate() + days);
? ? document.cookie = name + '=' + value + ';expires=' + date;
}
/**
*
* @desc 獲取瀏覽器類型和版本
* @return {String}
*/
function getExplore() {
? ? var sys = {},
? ? ? ? ua = navigator.userAgent.toLowerCase(),
? ? ? ? s; (s = ua.match(/rv:([\d.]+)\) like gecko/)) ? sys.ie = s[1] : (s = ua.match(/msie ([\d\.]+)/)) ? sys.ie = s[1] : (s = ua.match(/edge\/([\d\.]+)/)) ? sys.edge = s[1] : (s = ua.match(/firefox\/([\d\.]+)/)) ? sys.firefox = s[1] : (s = ua.match(/(?:opera|opr).([\d\.]+)/)) ? sys.opera = s[1] : (s = ua.match(/chrome\/([\d\.]+)/)) ? sys.chrome = s[1] : (s = ua.match(/version\/([\d\.]+).*safari/)) ? sys.safari = s[1] : 0;
? ? // 根據關系進行判斷
? ? if (sys.ie) return ('IE: ' + sys.ie)
? ? if (sys.edge) return ('EDGE: ' + sys.edge)
? ? if (sys.firefox) return ('Firefox: ' + sys.firefox)
? ? if (sys.chrome) return ('Chrome: ' + sys.chrome)
? ? if (sys.opera) return ('Opera: ' + sys.opera)
? ? if (sys.safari) return ('Safari: ' + sys.safari)
? ? return 'Unkonwn'
}
/**
*
* @desc 獲取操作系統類型
* @return {String}
*/
function getOS() {
? ? var userAgent = 'navigator' in window && 'userAgent' in navigator && navigator.userAgent.toLowerCase() || '';
? ? var vendor = 'navigator' in window && 'vendor' in navigator && navigator.vendor.toLowerCase() || '';
? ? var appVersion = 'navigator' in window && 'appVersion' in navigator && navigator.appVersion.toLowerCase() || '';
? ? if (/mac/i.test(appVersion)) return 'MacOSX'
? ? if (/win/i.test(appVersion)) return 'windows'
? ? if (/linux/i.test(appVersion)) return 'linux'
? ? if (/iphone/i.test(userAgent) || /ipad/i.test(userAgent) || /ipod/i.test(userAgent))'ios'
? ? if (/android/i.test(userAgent)) return 'android'
? ? if (/win/i.test(appVersion) && /phone/i.test(userAgent)) return 'windowsPhone'
}
/**
*
* @desc 獲取滾動條距頂部的距離
*/
function getScrollTop() {
? ? return (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;
}
/**
*
* @desc? 獲取一個元素的距離文檔(document)的位置,類似jQ中的offset()
* @param {HTMLElement} ele
* @returns { {left: number, top: number} }
*/
function offset(ele) {
? ? var pos = {
? ? ? ? left: 0,
? ? ? ? top: 0
? ? };
? ? while (ele) {
? ? ? ? pos.left += ele.offsetLeft;
? ? ? ? pos.top += ele.offsetTop;
? ? ? ? ele = ele.offsetParent;
? ? };
? ? return pos;
}
);
var setScrollTop = require('./setScrollTop');
var requestAnimFrame = (function() {
? ? return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame ||
? ? ? ? function(callback) {
? ? ? ? ? ? window.setTimeout(callback, 1000 / 60);
? ? ? ? };
})();
/**
*
* @desc? 在${duration}時間內,滾動條平滑滾動到${to}指定位置
* @param {Number} to
* @param {Number} duration
*/
function scrollTo(to, duration) {
? ? if (duration < 0) {
? ? ? ? setScrollTop(to);
? ? ? ? return
? ? }
? ? var diff = to - getScrollTop();
? ? if (diff === 0) return
? ? var step = diff / duration * 10;
? ? requestAnimationFrame(
? ? ? ? function() {
? ? ? ? ? ? if (Math.abs(step) > Math.abs(diff)) {
? ? ? ? ? ? ? ? setScrollTop(getScrollTop() + diff);
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? setScrollTop(getScrollTop() + step);
? ? ? ? ? ? if (diff > 0 && getScrollTop() >= to || diff < 0 && getScrollTop() <= to) {
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? scrollTo(to, duration - 16);
? ? ? ? });
}
/**
*
* @desc 設置滾動條距頂部的距離
*/
function setScrollTop(value) {
? ? window.scrollTo(0, value);
? ? return value;
}
keyCodeMap = {
? ? 8 : 'Backspace',
? ? 9 : 'Tab',
? ? 13 : 'Enter',
? ? 16 : 'Shift',
? ? 17 : 'Ctrl',
? ? 18 : 'Alt',
? ? 19 : 'Pause',
? ? 20 : 'Caps Lock',
? ? 27 : 'Escape',
? ? 32 : 'Space',
? ? 33 : 'Page Up',
? ? 34 : 'Page Down',
? ? 35 : 'End',
? ? 36 : 'Home',
? ? 37 : 'Left',
? ? 38 : 'Up',
? ? 39 : 'Right',
? ? 40 : 'Down',
? ? 42 : 'Print Screen',
? ? 45 : 'Insert',
? ? 46 : 'Delete',
? ? 48 : '0',
? ? 49 : '1',
? ? 50 : '2',
? ? 51 : '3',
? ? 52 : '4',
? ? 53 : '5',
? ? 54 : '6',
? ? 55 : '7',
? ? 56 : '8',
? ? 57 : '9',
? ? 65 : 'A',
? ? 66 : 'B',
? ? 67 : 'C',
? ? 68 : 'D',
? ? 69 : 'E',
? ? 70 : 'F',
? ? 71 : 'G',
? ? 72 : 'H',
? ? 73 : 'I',
? ? 74 : 'J',
? ? 75 : 'K',
? ? 76 : 'L',
? ? 77 : 'M',
? ? 78 : 'N',
? ? 79 : 'O',
? ? 80 : 'P',
? ? 81 : 'Q',
? ? 82 : 'R',
? ? 83 : 'S',
? ? 84 : 'T',
? ? 85 : 'U',
? ? 86 : 'V',
? ? 87 : 'W',
? ? 88 : 'X',
? ? 89 : 'Y',
? ? 90 : 'Z',
? ? 91 : 'Windows',
? ? 93 : 'Right Click',
? ? 96 : 'Numpad 0',
? ? 97 : 'Numpad 1',
? ? 98 : 'Numpad 2',
? ? 99 : 'Numpad 3',
? ? 100 : 'Numpad 4',
? ? 101 : 'Numpad 5',
? ? 102 : 'Numpad 6',
? ? 103 : 'Numpad 7',
? ? 104 : 'Numpad 8',
? ? 105 : 'Numpad 9',
? ? 106 : 'Numpad *',
? ? 107 : 'Numpad +',
? ? 109 : 'Numpad -',
? ? 110 : 'Numpad .',
? ? 111 : 'Numpad /',
? ? 112 : 'F1',
? ? 113 : 'F2',
? ? 114 : 'F3',
? ? 115 : 'F4',
? ? 116 : 'F5',
? ? 117 : 'F6',
? ? 118 : 'F7',
? ? 119 : 'F8',
? ? 120 : 'F9',
? ? 121 : 'F10',
? ? 122 : 'F11',
? ? 123 : 'F12',
? ? 144 : 'Num Lock',
? ? 145 : 'Scroll Lock',
? ? 182 : 'My Computer',
? ? 183 : 'My Calculator',
? ? 186 : ';',
? ? 187 : '=',
? ? 188 : ',',
? ? 189 : '-',
? ? 190 : '.',
? ? 191 : '/',
? ? 192 : '`',
? ? 219 : '[',
? ? 220 : '\\',
? ? 221 : ']',
? ? 222 : '\''
};
/**
* @desc 根據keycode獲得鍵名
* @param? {Number} keycode
* @return {String}
*/
function getKeyName(keycode) {
? ? if (keyCodeMap[keycode]) {
? ? ? ? return keyCodeMap[keycode];
? ? } else {
? ? ? ? console.log('Unknow Key(Key Code:' + keycode + ')');
? ? ? ? return
? ? ? ? '';
? ? }
};
/**
* @desc 深拷貝,支持常見類型
* @param {Any} values
*/
function deepClone(values) {
? ? var copy;
? ? // Handle the 3 simple types, and null or undefined
? ? if (null == values || "object" != typeof values) return values;
? ? // Handle Date
? ? if (values instanceof Date) {
? ? ? ? copy = new Date();
? ? ? ? copy.setTime(values.getTime());
? ? ? ? return copy;
? ? }
? ? // Handle Array
? ? if (values instanceof Array) {
? ? ? ? copy = [];
? ? ? ? for (var i = 0,
? ? ? ? ? ? len = values.length; i < len; i++) {
? ? ? ? ? ? copy[i] = deepClone(values[i]);
? ? ? ? }
? ? ? ? return copy;
? ? }
? ? // Handle Object
? ? if (values instanceof Object) {
? ? ? ? copy = {};
? ? ? ? for (var attr in values) {
? ? ? ? ? ? if (values.hasOwnProperty(attr)) copy[attr] = deepClone(values[attr]);
? ? ? ? }
? ? ? ? return copy;
? ? }
? ? throw new Error("Unable to copy values! Its type isn't supported.");
}
/**
*
* @desc? 判斷`obj`是否為空
* @param? {Object} obj
* @return {Boolean}
*/
function isEmptyObject(obj) {
? ? if (!obj || typeof obj !== 'object' || Array.isArray(obj))
? ? return? false
? ? return ! Object.keys(obj).length
}
/**
*
* @desc 隨機生成顏色
* @return {String}
*/
function randomColor() {
? ? return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice( - 6);
}
/**
*
* @desc 生成指定范圍隨機數
* @param? {Number} min
* @param? {Number} max
* @return {Number}
*/
function randomNum(min, max) {
? ? return Math.floor(min + Math.random() * (max - min));
}
/**
*
* @desc? 判斷是否為郵箱地址
* @param? {String}? str
* @return {Boolean}
*/
function isEmail(str) {
? ? return /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(str);
}
/**
*
* @desc? 判斷是否為身份證號
* @param? {String|Number} str
* @return {Boolean}
*/
function isIdCard(str) {
? ? return /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/.test(str)
}
/**
*
* @desc? 判斷是否為手機號
* @param? {String|Number} str
* @return {Boolean}
*/
function isPhoneNum(str) {
? ? return /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/.test(str)
}
/**
*
* @desc? 判斷是否為URL地址
* @param? {String} str
* @return {Boolean}
*/
function isUrl(str) {
? ? return /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&/ /= ] * ) / i.test(str);
}
/**
*
* @desc? 現金額轉大寫
* @param? {Number} n
* @return {String}
*/
function digitUppercase(n) {
? ? var fraction = ['角', '分'];
? ? var digit = ['零', '壹', '貳', '叁', '肆', '伍', '陸', '柒', '捌', '玖'];
? ? var unit = [['元', '萬', '億'], ['', '拾', '佰', '仟']];
? ? var head = n < 0 ? '欠': '';
? ? n = Math.abs(n);
? ? var s = '';
? ? for (var i = 0; i < fraction.length; i++) {
? ? ? ? s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
? ? }
? ? s = s || '整';
? ? n = Math.floor(n);
? ? for (var i = 0; i < unit[0].length && n > 0; i++) {
? ? ? ? var p = '';
? ? ? ? for (var j = 0; j < unit[1].length && n > 0; j++) {
? ? ? ? ? ? p = digit[n % 10] + unit[1][j] + p;
? ? ? ? ? ? n = Math.floor(n / 10);
? ? ? ? }
? ? ? ? s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
? ? }
? ? return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
};
/**
*
* @desc 判斷瀏覽器是否支持webP格式圖片
* @return {Boolean}
*/
function isSupportWebP() {
? ? return !! [].map && document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
}
/**
* @desc? 格式化${startTime}距現在的已過時間
* @param? {Date} startTime
* @return {String}
*/
function formatPassTime(startTime) {
? ? var currentTime = Date.parse(new Date()),
? ? ? ? time = currentTime - startTime,
? ? ? ? day = parseInt(time / (1000 * 60 * 60 * 24)),
? ? ? ? hour = parseInt(time / (1000 * 60 * 60)),
? ? ? ? min = parseInt(time / (1000 * 60)),
? ? ? ? month = parseInt(day / 30),
? ? ? ? year = parseInt(month / 12);
? ? if (year) return year + "年前"
? ? if (month) return month + "個月前"
? ? if (day) return day + "天前"
? ? if (hour) return hour + "小時前"
? ? if (min) return min + "分鐘前"
? ? else? return '剛剛'
}
/**
*
* @desc? 格式化現在距${endTime}的剩余時間
* @param? {Date} endTime
* @return {String}
*/
function formatRemainTime(endTime) {
? ? var startDate = new Date();
? ? //開始時間
? ? var endDate = new Date(endTime);
? ? //結束時間
? ? var t = endDate.getTime() - startDate.getTime();
? ? //時間差
? ? var d = 0,
? ? ? ? h = 0,
? ? ? ? m = 0,
? ? ? ? s = 0;
? ? if (t >= 0) {
? ? ? ? d = Math.floor(t / 1000 / 3600 / 24);
? ? ? ? h = Math.floor(t / 1000 / 60 / 60 % 24);
? ? ? ? m = Math.floor(t / 1000 / 60 % 60);
? ? ? ? s = Math.floor(t / 1000 % 60);
? ? }
? ? return d + "天 " + h + "小時 " + m + "分鐘 " + s + "秒";
}
/**
*
* @desc? url參數轉對象
* @param? {String} url? default: window.location.href
* @return {Object}
*/
function parseQueryString(url) {
? ? url = url == null ? window.location.href: url
? ? var search = url.substring(url.lastIndexOf('?') + 1)
? ? if (!search) {
? ? ? ? return {}
? ? }
? ? return JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}')
}
/**
*
* @desc? 對象序列化
* @param? {Object} obj
* @return {String}
*/
function stringfyQueryString(obj) {
? ? if (!obj) return? '';
? ? var pairs = [];
? ? for (var key in obj) {
? ? ? ? var value = obj[key];
? ? ? ? if (value instanceof Array) {
? ? ? ? ? ? for (var i = 0; i < value.length; ++i) {
? ? ? ? ? ? ? ? pairs.push(encodeURIComponent(key + '[' + i + ']') + '=' + encodeURIComponent(value[i]));
? ? ? ? ? ? }
? ? ? ? ? ? continue;
? ? ? ? }
? ? ? ? pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
? ? }
? ? return pairs.join('&');
}
/***
@desc函數節流。 * 適用于限制`resize`和`scroll`等函數的調用頻率 * *@param {
? ? Number
}
delay 0或者更大的毫秒數。對于事件回調,大約100或250毫秒(或更高)的延遲是最有用的。 * @param {
? ? Boolean
}
noTrailing可選,默認為false。 * 如果noTrailing為true,當節流函數被調用,每過`delay`毫秒`callback`也將執行一次。 * 如果noTrailing為false或者未傳入,`callback`將在最后一次調用節流函數后再執行一次. * (延遲`delay`毫秒之后,節流函數沒有被調用,
? ? 內部計數器會復位) * @param {
? ? Function
}
callback延遲毫秒后執行的函數。`this`上下文和所有參數都是按原樣傳遞的, * 執行去節流功能時,調用`callback`。 * @param {
? ? Boolean
}
debounceMode如果`debounceMode`為true,`clear`在`delay`ms后執行。 * 如果debounceMode是false,`callback`在`delay`ms之后執行。 * *@
return {
? ? Function
}新的節流函數
*/
function throttle(delay, noTrailing, callback, debounceMode) {
? ? // After wrapper has stopped being called,this timeout ensures that
// `callback` is executed at the proper times in `throttle` and `end`
// debounce modes.
? ? var timeoutID;
// Keep track of the last time `callback` was executed.
? ? var lastExec = 0;
// `noTrailing` defaults to falsy.
? ? if (typeof noTrailing !== 'boolean') {
? ? ? ? debounceMode = callback;
? ? ? ? callback = noTrailing;
? ? ? ? noTrailing = undefined;
? ? }
// The `wrapper` function encapsulates all of the throttling / debouncing
// functionality and when executed will limit the rate at which `callback`
// is executed.
? ? function wrapper() {
? ? ? ? var self = this;
? ? ? ? var elapsed = Number(new Date()) - lastExec;
? ? ? ? var args = arguments;
? ? ? ? // Execute `callback` and update the `lastExec` timestamp.
? ? ? ? function exec() {
? ? ? ? ? ? lastExec = Number(new Date());
? ? ? ? ? ? callback.apply(self, args);
? ? ? ? }
? ? ? ? // If `debounceMode` is true (at begin) this is used to clear the flag
? ? ? ? // to allow future `callback` executions.
? ? ? ? function clear() {
? ? ? ? ? ? timeoutID = undefined;
? ? ? ? }
? ? ? ? if (debounceMode && !timeoutID) {
? ? ? ? ? ? // Since `wrapper` is being called for the first time and
? ? ? ? ? ? // `debounceMode` is true (at begin), execute `callback`.
? ? ? ? ? ? exec();
? ? ? ? }
? ? ? ? // Clear any existing timeout.
? ? ? ? if (timeoutID) {
? ? ? ? ? ? clearTimeout(timeoutID);
? ? ? ? }
? ? ? ? if (debounceMode === undefined && elapsed > delay) {
? ? ? ? ? ? // In throttle mode, if `delay` time has been exceeded, execute
? ? ? ? ? ? // `callback`.
? ? ? ? ? ? exec();
? ? ? ? } else
? ? ? ? if (noTrailing !== true) {
? ? ? ? ? ? // In trailing throttle mode, since `delay` time has not been
? ? ? ? ? ? // exceeded, schedule `callback` to execute `delay` ms after most
? ? ? ? ? ? // recent execution.
? ? ? ? ? ? //
? ? ? ? ? ? // If `debounceMode` is true (at begin), schedule `clear` to execute
? ? ? ? ? ? // after `delay` ms.
? ? ? ? ? ? //
? ? ? ? ? ? // If `debounceMode` is false (at end), schedule `callback` to
? ? ? ? ? ? // execute after `delay` ms.
? ? ? ? ? ? timeoutID = setTimeout(debounceMode ? clear: exec, debounceMode === undefined ? delay - elapsed: delay);
? ? ? ? }
? ? }
// Return the wrapper function.
? ? return wrapper;
};
/**
* @desc 函數防抖
* 與throttle不同的是,debounce保證一個函數在多少毫秒內不再被觸發,只會執行一次,
* 要么在第一次調用return的防抖函數時執行,要么在延遲指定毫秒后調用。
* @example 適用場景:如在線編輯的自動存儲防抖。
* @param? {Number}? delay? ? ? ? 0或者更大的毫秒數。 對于事件回調,大約100或250毫秒(或更高)的延遲是最有用的。
* @param? {Boolean}? atBegin? ? ? 可選,默認為false。
*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果`atBegin`為false或未傳入,回調函數則在第一次調用return的防抖函數后延遲指定毫秒調用。
如果`atBegin`為true,回調函數則在第一次調用return的防抖函數時直接執行
* @param? {Function} callback? ? ? 延遲毫秒后執行的函數。`this`上下文和所有參數都是按原樣傳遞的,
*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 執行去抖動功能時,,調用`callback`。
*
* @return {Function} 新的防抖函數。
*/
var throttle = require('./throttle');
function debounce(delay, atBegin, callback) {
? ? return callback === undefined ? throttle(delay, atBegin, false) : throttle(delay, callback, atBegin !== false);
};
//只能為數字或字母
let reg=/^[0-9a-zA-Z]*$/g
//只能為數字,字母和英文逗號
let reg=/^[0-9a-zA-Z,]*$/g
//校驗基本日期格式
var reg1 =/^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/;
var reg2 =/^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}年\d{1,2}月\d{1,2}日$)$/;
//校驗密碼強度
var reg =/^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/;
//校驗中文
var reg =/^[\\u4e00-\\u9fa5]{0,}$/;
//由數字、26個英文字母或下劃線組成的字符串
var reg =/^\\w+$/;
//校驗E-Mail 地址
var reg =/[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?/;
//15位
var reg =/^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$/;
//18位
var reg =/^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$/;
//金額校驗,精確到2位小數
var reg =/^[0-9]+(.[0-9]{2})?$/;
//校驗手機號
var reg =/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$/;