js 常用方法

//轉化為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}$/;

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容