分享实用的JavaScript代码库

  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 /[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#?&//=]*)/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‘);



原文地址:https://www.cnblogs.com/NuoYer/p/8252563.html

时间: 2024-10-23 08:58:46

分享实用的JavaScript代码库的相关文章

9个实用的Javascript代码高亮脚本

代码高亮很有用,特别是在需要在网站或者blog中显示自己编写的代码的时候,或者给其他人查看或调试语法错误的时候.我们可以将代码高亮,以便阅读者可以十分方便的读取代码块,增加用户阅读代码的良好体验. 目前,有很多免费而且有用的代码高亮脚本.这些脚本大多是由Javascript语言编写,也有些使用其它语言(比如java.Phyton或Ruby)等写的. 下面来推荐最受欢迎.最实用的9个Javascript代码高亮脚本. 1. SyntaxHighlighter 我相信这是最普遍代码高亮代码.它支持多

一个很好用的在线编辑、展示、分享、交流JavaScript 代码的平台

在发表博客时,有一些代码只能粘贴进去,而不能看到代码运行的效果,需要读者把代码粘贴进自己的编辑器,然后再运行看效果,这是一件很耗时的事情 在平时百度的时候,我发现一些网站可以在线预览功能,而且可以在线修改代码查看效果,非常的炫丽,可以非常直观的看到代码的运行效果 我也想这样展示给别人我做的功能,所以我找到了一个平台 ---- runjs 网址:http://runjs.cn/ 非常好用!!! 如果不知道怎么使用,右侧有很问题帮助 点击编辑器,就可以编写代码,在线看效果啦 runJS还提供了很多常

pear中几个实用的xml代码库

1.XML_Beautifier 用于将一段排版凌乱的XML文档美化 1 <?php 2 require_once "XML/Beautifier.php"; 3 $fmt = new XML_Beautifier(); 4 $result = $fmt->formatFile('originalFile.xml', 'beautifiedFile.xml'); 5 if (PEAR::isError($result)) { 6 echo $result->getMe

实用的JS代码段(表单篇)

整理了下比较实用的Javascript代码段,完整的代码参考 1 多个window.onload方法 由于onload方法时在页面加载完成后,自动调用的.因此被广泛的使用,但是弊端是只能实用onload执行一个方法.下面代码段,可以保证多个方法在Onload时执行: function addLoadEvent(func){ var oldonload = window.onload; if(typeof window.onload != 'function'){ window.onload =

以优美方式编写JavaScript代码

英文原文:CoffeeScript: The beautiful way to write JavaScript 我用 JavaScript 编程很多年了,写了大量的 JavaScript 代码,即便是我这样的经历,但我仍然还在努力地去写出更优美的 JavaScript 代码,在这篇文章中,我将探索为什么写出漂亮的 JavaScript 代码是如此困难,如何使用CoffeScript(一种简约且能编译成 JavaScript 的语言)改善它. 什么是优美的代码? 我想从个人观点来声明如何定义优美

[CoffeeScript]以优美方式编写JavaScript代码

?? 我用JavaScript 编程很多年了,写了大量的JS代码,即便是我这样的经历,但我仍然还在努力地去写出更优美的JS代码,在这篇文章中,我将探索为什么写出漂亮的JS代码是如此困难,如何使用CoffeScript(一种简约且能编译成JS的语言)改善它. 什么是优美的代码? 我想从个人观点来声明如何定义优美代码 1.优美的代码是使用更少的代码解决问题: 2.优美的代码是可读而且易理解的 3.优美的代码是一段既没有什么可以需要添加也没有什么多余的可以去掉代码(就像伟大的的设计) 4.最短长度是优

自建JS代码库(1)---添加用户的常用验证

自建JS代码库(1)---添加用户的常用验证 大家都知道现在有许多比较成熟的javascript代码库,比如:JQuery,Prototype等,里面有许多经过验证的非常好用的函数.这些优秀的代码库能够提高我们的开发效率,但是我们在开发过程中同时还会遇到一些经常使用的方法,而这些可能写起来也比较的繁琐,这个时候我们有自己的代码库直接Copy代码是不是能够让你心情愉悦呢? 今天简单的整理了一下,在项目开发过程中添加系统用户的时候可能会使用到的一些常用的验证. 1.判断用户名只能是字母或数字,且长度

JavaScript的代码库

JavaScript的代码库 本文主要是汇集了一些JavaScript中一些经常使用代码.方便以后查找和复用. javascript框架: <script language="javascript" type="text/javascript"> //javascript代码 </script> JS中自己定义函数的定义: function 函数名() { //函数体 } 三大结构: 1.顺序结构: 2.选择结构: if(结果为布尔类型的表达

RunJS - 在线编辑、展示、分享、交流你的 JavaScript 代码

发现一个很好玩,很强大的网站 RunJS - 在线编辑.展示.分享.交流你的 JavaScript 代码   http://runjs.cn/ 比如: http://runjs.cn/detail/lp6rqcsr 或者: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <title>登录</title> <