分享實用的JavaScript代碼庫

来源:https://www.cnblogs.com/NuoYer/archive/2018/01/09/8252563.html
-Advertisement-
Play Games

調用: $.getCookie('name'); ...


 

  1 var keyCodeMap = {
  2     8: 'Backspace',
  3     9: 'Tab',
  4     13: 'Enter',
  5     16: 'Shift',
  6     17: 'Ctrl',
  7     18: 'Alt',
  8     19: 'Pause',
  9     20: 'Caps Lock',
 10     27: 'Escape',
 11     32: 'Space',
 12     33: 'Page Up',
 13     34: 'Page Down',
 14     35: 'End',
 15     36: 'Home',
 16     37: 'Left',
 17     38: 'Up',
 18     39: 'Right',
 19     40: 'Down',
 20     42: 'Print Screen',
 21     45: 'Insert',
 22     46: 'Delete',
 23     48: '0',
 24     49: '1',
 25     50: '2',
 26     51: '3',
 27     52: '4',
 28     53: '5',
 29     54: '6',
 30     55: '7',
 31     56: '8',
 32     57: '9',
 33     65: 'A',
 34     66: 'B',
 35     67: 'C',
 36     68: 'D',
 37     69: 'E',
 38     70: 'F',
 39     71: 'G',
 40     72: 'H',
 41     73: 'I',
 42     74: 'J',
 43     75: 'K',
 44     76: 'L',
 45     77: 'M',
 46     78: 'N',
 47     79: 'O',
 48     80: 'P',
 49     81: 'Q',
 50     82: 'R',
 51     83: 'S',
 52     84: 'T',
 53     85: 'U',
 54     86: 'V',
 55     87: 'W',
 56     88: 'X',
 57     89: 'Y',
 58     90: 'Z',
 59     91: 'Windows',
 60     93: 'Right Click',
 61     96: 'Numpad 0',
 62     97: 'Numpad 1',
 63     98: 'Numpad 2',
 64     99: 'Numpad 3',
 65     100: 'Numpad 4',
 66     101: 'Numpad 5',
 67     102: 'Numpad 6',
 68     103: 'Numpad 7',
 69     104: 'Numpad 8',
 70     105: 'Numpad 9',
 71     106: 'Numpad *',
 72     107: 'Numpad +',
 73     109: 'Numpad -',
 74     110: 'Numpad .',
 75     111: 'Numpad /',
 76     112: 'F1',
 77     113: 'F2',
 78     114: 'F3',
 79     115: 'F4',
 80     116: 'F5',
 81     117: 'F6',
 82     118: 'F7',
 83     119: 'F8',
 84     120: 'F9',
 85     121: 'F10',
 86     122: 'F11',
 87     123: 'F12',
 88     144: 'Num Lock',
 89     145: 'Scroll Lock',
 90     182: 'My Computer',
 91     183: 'My Calculator',
 92     186: ';',
 93     187: '=',
 94     188: ',',
 95     189: '-',
 96     190: '.',
 97     191: '/',
 98     192: '`',
 99     219: '[',
100     220: '\\',
101     221: ']',
102     222: '\''
103 };
104 
105 // 數據請求封裝
106 $.extend({
107     getJson: function (url, data, success) {//getJson--同步方法---獲取會員信息,推薦人
108         return $.ajax({
109             url: url,
110             type: 'get',
111             dataType: 'json',
112             async: false,
113             cache: true,
114             data: data,
115             success: function (result) {
116                 success(result);
117             }
118         });
119     },
120     getAsyncJson: function (url, data, success) {
121         return $.ajax({
122             url: url,
123             type: 'get',
124             dataType: 'json',
125             async: true,
126             cache: true,
127             data: data,
128             success: function (result) {
129                 success(result);
130             }
131         });
132     },
133     postAsyncJson: function (url, data, success) {
134         return $.ajax({
135             url: url,
136             type: 'post',
137             dataType: 'json',
138             //contentType: "application/json",
139             beforeSend: function (xhr) {
140                 xhr.setRequestHeader("XSRF-TOKEN",
141                     $('input:hidden[name="__RequestVerificationToken"]').val());
142             },
143             async: true,
144             cache: false,
145             data: data,
146             success: function (result) {
147                 success(result);
148             }
149         });
150     },
151     postAsyncContentJson: function (url, data, success) {
152         data = JSON.stringify(data);
153         return $.ajax({
154             url: url,
155             type: 'post',
156             dataType: 'json',
157             contentType: "application/json",
158             beforeSend: function (xhr) {
159                 xhr.setRequestHeader("XSRF-TOKEN",
160                     $('input:hidden[name="__RequestVerificationToken"]').val());
161             },
162             async: true,
163             cache: false,
164             data: data,
165             success: function (result) {
166                 success(result);
167             }
168         });
169     },
170     postJson: function (url, data, success) {
171         return $.ajax({
172             url: url,
173             type: 'post',
174             dataType: 'json',
175             beforeSend: function (xhr) {
176                 xhr.setRequestHeader("XSRF-TOKEN",
177                     $('input:hidden[name="__RequestVerificationToken"]').val());
178             },
179             async: false,
180             cache: false,
181             data: data,
182             success: function (result) {
183                 success(result);
184             }
185         });
186     },
187     getHtml: function (url, data, success) {
188         return $.ajax({
189             url: url,
190             type: 'get',
191             dataType: 'html',
192             async: false,
193             cache: false,
194             data: data,
195             success: function (result) {
196                 success(result);
197             }
198         });
199     },
200     getAsyncHtml: function (url, data, success) {
201         return $.ajax({
202             url: url,
203             type: 'get',
204             dataType: 'html',
205             async: true,
206             cache: false,
207             data: data,
208             success: function (result) {
209                 success(result);
210             }
211         });
212     },
213     postHtml: function (url, data, success) {
214         return $.ajax({
215             url: url,
216             type: 'post',
217             dataType: 'html',
218             async: true,
219             cache: false,
220             data: data,
221             success: function (result) {
222                 success(eval(result));
223             }
224         });
225     },
226     commonUploadImg: function (fileToUploadId, uploadFileType, isCompress, success) {
227         if (!fileToUploadId) {
228             layer.msg('上傳控制項ID不能為空!');
229             return;
230         }
231         var formData = new FormData();
232         var files = $('#' + fileToUploadId)[0].files[0];
233         if (!files) {
234             layer.msg('請選擇圖片文件');
235             return;
236         }
237         if (files.size > 5242880) {
238             layer.msg('請上傳小於5M以下的圖片');
239             return;
240         }
241         if (files.type == 'image/jpeg' || files.type == 'image/png') {
242 
243         } else {
244             layer.msg('請上傳圖片文件!');
245             return;
246         }
247         formData.append("file", files);
248         formData.append("userId", user_id);
249         formData.append("uploadFileType", uploadFileType);
250         formData.append("isCompress", isCompress);
251         $.ajax({
252             url: '',
253             type: "POST",
254             data: formData,
255             processData: false,
256             contentType: false,
257             async: false,
258             cache: false,
259             success: function (data) {
260                 if (data && data.succeed) {
261                     success(data.values);
262                 }
263                 else {
264                     if (data.errmsg) {
265                         layer.msg(data.errmsg);
266                     }
267                     else {
268                         layer.msg('上傳圖片失敗,請稍後再試!');
269                     }
270                 }
271             }
272         });
273     },
274     isNullOrWhiteSpace: function (str) {
275         // 判斷字元串是否為null,還是空或是空字元串,返回true或false
276         try {
277             if (str != null || str != undefined)
278                 str = str.replace(/\ +/g, "");
279             if (str == null || str == '' || str == undefined) {
280                 return false;
281             }
282             else {
283                 return true;
284             }
285         }
286         catch (ex) {
287             return false;
288         }
289     },
290     setCookie: function (c_name, value, expiredays) { //寫cookies
291         var exdate = new Date();
292         exdate.setDate(exdate.getDate() + expiredays);
293         document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
294     },
295     getCookie: function (name) { //讀取cookies
296         var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
297         if (arr = document.cookie.match(reg))
298             return (arr[2]);
299         else
300             return null;
301     },
302     delCookie: function (name) { //刪除cookies
303         var exp = new Date();
304         exp.setTime(exp.getTime() - 1);
305         var cval = getCookie(name);
306         if (cval != null)
307             document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
308     },
309     setLocalStorage: function (name, value) {// 寫入LocalStorage
310         if (!window.localStorage) {
311             return false;
312         }
313         else {
314             var storage = window.localStorage;
315             storage.setItem(name, value);
316         }
317     },
318     getLocalStorage: function (name) { // 讀取LocalStorage
319         if (!window.localStorage) {
320             return false;
321         }
322         else {
323             var storage = window.localStorage;
324             return storage.getItem(name);
325         }
326     },
327     removeLocalStorage: function (name) { // 刪除LocalStorage
328         if (!window.localStorage) {
329             return false;
330         }
331         else {
332             if (name != null && name != '' && name != undefined) {
333                 var storage = window.localStorage;
334                 storage.removeItem(name);
335             }
336         }
337     },
338     minuteByDateTime: function (date) {
339         var timestamp = Date.parse(new Date(date));
340         date = timestamp / 1000;
341         //獲取js 時間戳
342         var time = new Date().getTime();
343         //去掉 js 時間戳後三位,與php 時間戳保持一致
344         time = parseInt((time - date * 1000) / 1000);
345         //存儲轉換值 
346         var s;
347         if (time < 60 * 1) {//十分鐘內
348             return '剛剛';
349         } else if ((time < 60 * 60)) {
350             //超過十分鐘少於1小時
351             s = Math.floor(time / 60);
352             return s + "分鐘";
353         } else if ((time < 60 * 60 * 24) && (time >= 60 * 60)) {
354             //超過1小時少於24小時
355             s = Math.floor(time / 60 / 60);
356             return s + "小時";
357         } else if ((time < 60 * 60 * 24 * 3) && (time >= 60 * 60 * 24)) {
358             //超過1天少於3天內
359             s = Math.floor(time / 60 / 60 / 24);
360             return s + "天";
361         } else {
362             //超過3天
363             var date = new Date(parseInt(date) * 1000);
364             return date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate();
365         }
366     },
367     getQueryString: function () { // 獲取URL參數
368         var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
369         var r = window.location.search.substr(1).match(reg);  //獲取url中"?"符後的字元串並正則匹配
370         var context = "";
371         if (r != null)
372             context = r[2];
373         reg = null;
374         r = null;
375         return context == null || context == "" || context == "undefined" ? "" : context;
376     },
377     newGuid: function () {
378         var guid = "";
379         for (var i = 1; i <= 32; i++) {
380             var n = Math.floor(Math.random() * 16.0).toString(16);
381             guid += n;
382             if ((i == 8) || (i == 12) || (i == 16) || (i == 20))
383                 guid += "-";
384         }
385         return guid;
386     },
387     /**
388     * 
389     * @desc 判斷兩個數組是否相等
390     * @param {Array} arr1 
391     * @param {Array} arr2 
392     * @return {Boolean}
393     */
394     arrayEqual: function (arr1, arr2) {
395         if (arr1 === arr2) return true;
396         if (arr1.length != arr2.length) return false;
397         for (var i = 0; i < arr1.length; ++i) {
398             if (arr1[i] !== arr2[i]) return false;
399         }
400         return true;
401     },
402     /**
403     * 
404     * @desc   為元素添加class
405     * @param  {HTMLElement} ele 
406     * @param  {String} cls 
407     */
408     addClass: function (ele, cls) {
409         if (!hasClass(ele, cls)) {
410             ele.className += ' ' + cls;
411         }
412     },
413     /**
414     * 
415     * @desc 判斷元素是否有某個class
416     * @param {HTMLElement} ele 
417     * @param {String} cls 
418     * @return {Boolean}
419     */
420     hasClass: function (ele, cls) {
421         return (new RegExp('(\\s|^)' + cls + '(\\s|$)')).test(ele.className);
422     },
423     removeClass: function (ele, cls) {
424         if ($.hasClass(ele, cls)) {
425             var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
426             ele.className = ele.className.replace(reg, ' ');
427         }
428     },
429     /**
430     * 
431     * @desc 獲取瀏覽器類型和版本
432     * @return {String} 
433     */
434     getExplore: function () {
435         var sys = {},
436             ua = navigator.userAgent.toLowerCase(),
437             s;
438         (s = ua.match(/rv:([\d.]+)\) like gecko/)) ? sys.ie = s[1] :
439             (s = ua.match(/msie ([\d\.]+)/)) ? sys.ie = s[1] :
440                 (s = ua.match(/edge\/([\d\.]+)/)) ? sys.edge = s[1] :
441                     (s = ua.match(/firefox\/([\d\.]+)/)) ? sys.firefox = s[1] :
442                         (s = ua.match(/(?:opera|opr).([\d\.]+)/)) ? sys.opera = s[1] :
443                             (s = ua.match(/chrome\/([\d\.]+)/)) ? sys.chrome = s[1] :
444                                 (s = ua.match(/version\/([\d\.]+).*safari/)) ? sys.safari = s[1] : 0;
445         // 根據關係進行判斷
446         if (sys.ie) return ('IE: ' + sys.ie)
447         if (sys.edge) return ('EDGE: ' + sys.edge)
448         if (sys.firefox) return ('Firefox: ' + sys.firefox)
449         if (sys.chrome) return ('Chrome: ' + sys.chrome)
450         if (sys.opera) return ('Opera: ' + sys.opera)
451         if (sys.safari) return ('Safari: ' + sys.safari)
452         return 'Unkonwn'
453     },
454     /**
455     * 
456     * @desc 獲取操作系統類型
457     * @return {String} 
458     */
459     getOS: function () {
460         var userAgent = 'navigator' in window && 'userAgent' in navigator && navigator.userAgent.toLowerCase() || '';
461         var vendor = 'navigator' in window && 'vendor' in navigator && navigator.vendor.toLowerCase() || '';
462         var appVersion = 'navigator' in window && 'appVersion' in navigator && navigator.appVersion.toLowerCase() || '';
463         if (/mac/i.test(appVersion)) return 'MacOSX';
464         if (/win/i.test(appVersion)) return 'windows'
465         if (/linux/i.test(appVersion)) return 'linux'
466         if (/iphone/i.test(userAgent) || /ipad/i.test(userAgent) || /ipod/i.test(userAgent)) 'ios'
467         if (/android/i.test(userAgent)) return 'android'
468         if (/win/i.test(appVersion) && /phone/i.test(userAgent)) return 'windowsPhone'
469     },
470     /**
471     * 
472     * @desc 獲取滾動條距頂部的距離
473     */
474     getScrollTop: function () {
475         return (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;
476     },
477     /**
478     * 
479     * @desc  獲取一個元素的距離文檔(document)的位置,類似jQ中的offset()
480     * @param {HTMLElement} ele 
481     * @returns { {left: number, top: number} }
482     */
483     offset: function (ele) {
484         var pos = {
485             left: 0,
486             top: 0
487         };
488         while (ele) {
489             pos.left += ele.offsetLeft;
490             pos.top += ele.offsetTop;
491             ele = ele.offsetParent;
492         };
493         return pos;
494     },
495     /**
496     * 
497     * @desc 設置滾動條距頂部的距離
498     */
499     setScrollTop: function (value) {
500         window.scrollTo(0, value);
501         return value;
502     },
503     /**
504     * @desc 根據keycode獲得鍵名
505     * @param  {Number} keycode 
506     * @return {String}
507     */
508     getKeyName: function (keycode) {
509         if (keyCodeMap[keycode]) {
510             return keyCodeMap[keycode];
511         } else {
512             console.log('Unknow Key(Key Code:' + keycode + ')');
513             return '';
514         }
515     },
516     /**
517     * @desc 深拷貝,支持常見類型
518     * @param {Any} values
519     */
520     deepClone: function (values) {
521         var copy;
522         // Handle the 3 simple types, and null or undefined
523         if (null == values || "object" != typeof values) return values;
524         // Handle Date
525         if (values instanceof Date) {
526             copy = new Date();
527             copy.setTime(values.getTime());
528             return copy;
529         }
530         // Handle Array
531         if (values instanceof Array) {
532             copy = [];
533             for (var i = 0, len = values.length; i < len; i++) {
534                 copy[i] = deepClone(values[i]);
535             }
536             return copy;
537         }
538         // Handle Object
539         if (values instanceof Object) {
540             copy = {};
541             for (var attr in values) {
542                 if (values.hasOwnProperty(attr)) copy[attr] = deepClone(values[attr]);
543             }
544             return copy;
545         }
546         throw new Error("Unable to copy values! Its type isn't supported.");
547     },
548     /**
549     * 
550     * @desc   判斷`obj`是否為空
551     * @param  {Object} obj
552     * @return {Boolean}
553     */
554     isEmptyObject: function (obj) {
555         if (!obj || typeof obj !== 'object' || Array.isArray(obj))
556             return false
557         return !Object.keys(obj).length
558     },
559     /**
560     * 
561     * @desc 隨機生成顏色
562     * @return {String} 
563     */
564     randomColor: function () {
565         return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
566     },
567     /**
568     * 
569     * @desc 生成指定範圍隨機數
570     * @param  {Number} min 
571     * @param  {Number} max 
572     * @return {Number} 
573     */
574     randomNum: function (min, max) {
575         return Math.floor(min + Math.random() * (max - min));
576     },
577     /**
578     * 
579     * @desc   判斷是否為郵箱地址
580     * @param  {String}  str
581     * @return {Boolean} 
582     */
583     isEmail: function (str) {
584         return /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(str);
585     },
586     /**
587     * 
588     * @desc  判斷是否為身份證號
589     * @param  {String|Number} str 
590     * @return {Boolean}
591     */
592     isIdCard: function (str) {
593         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)
594     },
595     /**
596     * 
597     * @desc   判斷是否為手機號
598     * @param  {String|Number} str 
599     * @return {Boolean} 
600     */
601     isPhoneNum: function (str) {
602         return /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/.test(str)
603     },
604     /**
605     * 
606     * @desc   判斷是否為URL地址
607     * @param  {String} str 
608     * @return {Boolean}
609     */
610     isUrl: function (str) {
611         return /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/i.test(str);
612     },
613     /**
614     * 
615     * @desc   現金額轉大寫
616     * @param  {Number} n 
617     * @return {String}
618     */
619     digitUppercase: function (n) {
620         var fraction = ['角', '分'];
621         var digit = [
622             '零', '壹', '貳', '叄', '肆',
623             '伍', '陸', '柒', '捌', '玖'
624         ];
625         var unit = [
626             ['元', '萬', '億'],
627             ['', '拾', '佰', '仟']
628         ];
629         var head = n < 0 ? '欠' : '';
630         n = Math.abs(n);
631         var s = '';
632         for (var i = 0; i < fraction.length; i++) {
633             s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
634         }
635         s = s || '整';
636         n = Math.floor(n);
637         for (var i = 0; i < unit[0].length && n > 0; i++) {
638             var p = '';
639             for (var j = 0; j < unit[1].length && n > 0; j++) {
640                 p = digit[n % 10] + unit[1][j] + p;
641                 n = Math.floor(n / 10);
642             }
643             s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
644         }
645         return head + s.replace(/(零.)*零元/, '元')
646             .replace(/(零.)+/g, '零')
647             .replace(/^整$/, '零元整');
648     },
649     /**
650     * 
651     * @desc 判斷瀏覽器是否支持webP格式圖片
652     * @return {Boolean} 
653     */
654     isSupportWebP: function () {
655         return !![].map && document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
656     },
657     /**
658     * @desc   格式化${startTime}距現在的已過時間
659     * @param  {Date} startTime 
660     * @return {String}
661     */
662     formatPassTime: function (startTime) {
663         var currentTime = Date.parse(new Date()),
664             time = currentTime - startTime,
665             day = parseInt(time / (1000 * 60 * 60 * 24)),
666             hour = parseInt(time / (1000 * 60 * 60)),
667             min = parseInt(time / (1000 * 60)),
668             month = parseInt(day / 30),
669             year = parseInt(month / 12);
670         if (year) return year + "年前"
671         if (month) return month + "個月前"
672         if (day) return day + "天前"
673         if (hour) return hour + "小時前"
674         if (min) return min + "分鐘前"
675         else return '剛剛'
676     },
677     /**
678     * 
679     * @desc   格式化現在距${endTime}的剩餘時間
680     * @param  {Date} endTime  
681     * @return {String}
682     */
683     formatRemainTime: function (endTime) {
684         var startDate = new Date(); //開始時間
685         var endDate = new Date(endTime); //結束時間
686         var t = endDate.getTime() - startDate.getTime(); //時間差
687         var d = 0,
688             h = 0,
689             m = 0,
690             s = 0;
691         if (t >= 0) {
692             d = Math.floor(t / 1000 / 3600 / 24);
693             h = Math.floor(t / 1000 / 60 / 60 % 24);
694             m = Math.floor(t / 1000 / 60 % 60);
695             s = Math.floor(t / 1000 % 60);
696         }
697         return d + "天 " + h + "小時 " + m + "分鐘 " + s + "秒";
698     },
699     /**
700     * 
701     * @desc   url參數轉對象
702     * @param  {String} url  default: window.location.href
703     * @return {Object} 
704     */
705     parseQueryString: function (url) {
706         url = url == null ? window.location.href : url
707         var search = url.substring(url.lastIndexOf('?') + 1)
708         if (!search) {
709             return {}
710         }
711         return JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}')
712     },
713     /**
714     * 
715     * @desc   對象序列化
716     * @param  {Object} obj 
717     * @return {String}
718     */
719     stringfyQueryString: function (obj) {
720         if (!obj) return '';
721         var pairs = [];
722         for (var key in obj) {
723             var value = obj[key];
724             if (value instanceof Array) {
725                 for (var i = 0; i < value.length; ++i) {
726                     pairs.push(encodeURIComponent(key + '[' + i + ']') + '=' + encodeURIComponent(value[i]));
727                 }
728                 continue;
729             }
730             pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
731         }
732         return pairs.join('&');
733     },
734     /**
735     * @desc   函數節流。
736     * 適用於限制`resize`和`scroll`等函數的調用頻率
737     *
738     * @param  {Number}    delay          0 或者更大的毫秒數。 對於事件回調,大約100或250毫秒(或更高)的延遲是最有用的。
739     * @param  {Boolean}   noTrailing     可選,預設為false。
740     *                                    如果noTrailing為true,當節流函數被調用,每過`delay`毫秒`callback`也將執行一次。
741     *                                    如果noTrailing為false或者未傳入,`callback`將在最後一次調用節流函數後再執行一次.
742     *                                    (延遲`delay`毫秒之後,節流函數沒有被調用,內部計數器會複位)
743     * @param  {Function}  callback       延遲毫秒後執行的函數。`this`上下文和所有參數都是按原樣傳遞的,
744     *                                    執行去節流功能時,調用`callback`。
745     * @param  {Boolean}   debounceMode   如果`debounceMode`為true,`clear`在`delay`ms後執行。
746     *                                    如果debounceMode是false,`callback`在`delay` ms之後執行。
747     *
748     * @return {Function}  新的節流函數
749     */
750     throttle: function (delay, noTrailing, callback, debounceMode) {
751         // After wrapper has stopped being called, this timeout ensures that
752         // `callback` is executed at the proper times in `throttle` and `end`
753         // debounce modes.
754         var timeoutID;
755         // Keep track of the last time `callback` was executed.
756         var lastExec = 0;
757         // `noTrailing` defaults to falsy.
758         if (typeof noTrailing !== 'boolean') {
759             debounceMode = callback;
760             callback = noTrailing;
761             noTrailing = undefined;
762         }
763         // The `wrapper` function encapsulates all of the throttling / debouncing
764         // functionality and when executed will limit the rate at which `callback`
765         // is executed.
766         function wrapper() {
767             var self = this;
768             var elapsed = Number(new Date()) - lastExec;
769             var args = arguments;
770             // Execute `callback` and update the `lastExec` timestamp.
771             function exec() {
772                 lastExec = Number(new Date());
773                 callback.apply(self, args);
774             }
775             // If `debounceMode` is true (at begin) this is used to clear the flag
776             // to allow future `callback` executions.
777             function clear() {
778                 timeoutID = undefined;
779             }
780             if (debounceMode && !timeoutID) {
781                 // Since `wrapper` is being called for the first time and
782                 // `debounceMode` is true (at begin), execute `callback`.
783                 exec();
784             }
785             // Clear any existing timeout.
786             if (timeoutID) {
787                 clearTimeout(timeoutID);
788             }
789             if (debounceMode === undefined && elapsed > delay) {
790                 // In throttle mode, if `delay` time has been exceeded, execute
791                 // `callback`.
792                 exec();
793             } else if (noTrailing !== true) {
794                 // In trailing throttle mode, since `delay` time has not been
795                 // exceeded, schedule `callback` to execute `delay` ms after most
796                 // recent execution.
797                 //
798                 // If `debounceMode` is true (at begin), schedule `clear` to execute
799                 // after `delay` ms.
800                 //
801                 // If `debounceMode` is false (at end), schedule `callback` to
802                 // execute after `delay` ms.
803                 timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === undefined ? delay - elapsed : delay);
804             }
805         }
806         // Return the wrapper function.
807         return wrapper;
808     }
809 });

 

調用:

$.getCookie('name');



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近都在折騰 Sagit 架框的記憶體釋放的問題,所以對這一塊有些心得。對於新手,學到的文章都在教你用:typeof(self) __weak weakSelf = self。對於老手,可能早習慣了到處了WeakSelf了。這次,就來學學,如何不用WeakSelf。 ...
  • 1,navigator 跳轉時 wxml頁面(參數多時可用“&”) 或者添加點擊事件,js用navigateTo跳轉傳參,兩種效果一樣 js頁面 在onLoad里直接獲取 2.全局變數 app.js頁面 賦值: 取值: 3.列表index下標取值 wxml頁面 如果需要傳遞多個,可以寫多個data- ...
  • 先看一下消息轉發流程: 在forwardInvocation這一步,你必須要實現一個方法: 該方法用於說明消息的返回值和參數類型。NSMethodSignature是方法簽名,它是用來記錄返回值和參數類型的一個對象。看一下與該類相關的方法: 2和3兩個方法是根據SEL來構造NSMethodSigna ...
  • 空頁面的顯示很常用,所以自己做了一個通用的空頁面顯示,先看效果圖 在有網路的時候正常載入顯示,在沒有網路的時候自動載入空頁面,點擊空頁面重新載入網路請求的一個功能 1:定義一個xml頁面,頁面佈局是一個iamgeview和一個textview的顯示 2:添加輔助類,控制載入空頁面和顯示隱藏等邏輯 3 ...
  • ES6新增的特性中,Generator無疑是最為強大者之一,它與Promise結合起來,為令前端頭疼的非同步回調難題提供了終極解決方案! ...
  • for迴圈案例 今天給大家介紹點for迴圈的案例 1.大馬馱2石糧食,中馬馱1石糧食,兩頭小馬馱一石糧食,要用100匹馬,馱100石糧食,該如何調配? 2.某偵察隊接到一項緊急任務,要求在A、B、C、D、E、F六個隊員中儘可能多地挑若幹人,但有以下限制條件: ●A和B兩人中至少去一人; ●A和D不能 ...
  • 有時候我們需要拿到對象和數組進行操作卻避免其受影響,就需要拷貝一份新的出來。 對於字元串的拷貝是對其值進行複製: 對對象的拷貝: 圖中是我的理解,Object.assign()只實現了一級克隆,當然對於沒有嵌套的對象可以直接用,可是對於多層嵌套的對象,也想對其子對象進行克隆這種方法就不行了。 通常對 ...
  • 前言 在《執行環境》文中說到,當JavaScript代碼執行一段可執行代碼時,會創建對應的執行上下文(execution context)。 變數對象(Variable object,VO) 作用域鏈(Scope chain) this 詞法作用域 在《作用域》中說到JavaScript採用詞法作用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...