UNPKG

39.3 kBJavaScriptView Raw
1/*!
2 * Buession prototype v2.2.2
3 *
4 * @link https://prototype.buession.com/
5 * @source https://github.com/buession/buession-prototype
6 * @copyright @ 2020-2023 Buession.com Inc.
7 * @license MIT
8 * @Build Time Thu, 24 Aug 2023 05:04:28 GMT
9 */
10
11/**
12 * Prototype 对象
13 */
14var Prototype = {
15 /**
16 * 版本
17 */
18 version: "v2.2.2",
19 /**
20 * 空方法
21 *
22 * @return void
23 */
24 emptyFunction: function () {
25 },
26 /**
27 *
28 * @param x 任意参数
29 * @return 任意值
30 */
31 K: function (x) {
32 return x;
33 }
34};
35window.Prototype = Prototype;
36
37/**
38 * Try 对象
39 */
40var Try = {
41 /**
42 * 接收任意数目的函数作为参数,返回第一个执行成功的函数(未抛出异常的函数)的结果
43 *
44 * @return 任意函数参数执行结果
45 */
46 these: function () {
47 var result;
48 for (var i = 0; i < arguments.length; i++) {
49 var lambda = arguments[i];
50 if (Object.isFunction(lambda)) {
51 try {
52 result = lambda();
53 break;
54 }
55 catch (e) {
56 console.error(e);
57 }
58 }
59 }
60 return result;
61 }
62};
63window.Try = Try;
64
65/**
66 * Optional 对象
67 */
68var Optional = /** @class */ (function () {
69 /**
70 * 构造函数
71 *
72 * @param value T 类型的值
73 */
74 function Optional(value) {
75 this.value = value;
76 }
77 /**
78 * 返回一个指定 T 类型的值的 Optional 实例
79 *
80 * @param value T 类型的值
81 * @return T 类型的值的 Optional 实例
82 */
83 Optional.of = function (value) {
84 return new Optional(value);
85 };
86 /**
87 * 如果为非 null 或 undefined,返回 Optional 描述的指定值的实例,否则返回空的 Optional 实例
88 *
89 * @param value T 类型的值
90 * @return T 类型的值的 Optional 实例,或空的 Optional 实例
91 */
92 Optional.ofNullable = function (value) {
93 return Object.isUndefinedOrNull(value) ? Optional.empty() : new Optional(value);
94 };
95 /**
96 * 返回空的 Optional 实例
97 *
98 * @return 空的 Optional 实例
99 */
100 Optional.empty = function () {
101 return new Optional(null);
102 };
103 /**
104 * 如果 value 不为 null 或 undefined,则返回 value 的值;否则抛出异常
105 *
106 * @return Optional 中包含这个值
107 */
108 Optional.prototype.get = function () {
109 if (this.value === null || typeof this.value === 'undefined') {
110 throw "No value present";
111 }
112 return this.value;
113 };
114 /**
115 * 如果 value 不为 null 或 undefined,则返回 value 的值;否则返回 other
116 *
117 * @param other 其它值
118 * @return value 不为 null 或 undefined,则返回 value 的值;否则返回 other
119 */
120 Optional.prototype.orElse = function (other) {
121 return Object.isUndefinedOrNull(this.value) ? other : this.value;
122 };
123 /**
124 * 如果 value 不为 null 或 undefined,则返回 true;否则返回 false
125 *
126 * @return value 不为 null 或 undefined,则返回 true;否则返回 false
127 */
128 Optional.prototype.isPresent = function () {
129 return Object.isUndefinedOrNull(this.value) === false;
130 };
131 return Optional;
132}());
133window.Optional = Optional;
134
135/**
136 * Object 对象扩展
137 */
138/**
139 * 获取对象数据类型
140 *
141 * @param obj 对象变量
142 * @return 对象数据类型
143 */
144Object.type = function (obj) {
145 return typeof obj;
146};
147/**
148 * 获取对象数据类型
149 *
150 * @param obj 对象变量
151 * @return 对象数据类型
152 */
153Object.rawType = function (obj) {
154 return Object.prototype.toString.call(obj).slice(8, -1);
155};
156/**
157 * 判断对象是否为 object 类型
158 *
159 * @param obj 任意对象
160 * @return boolean
161 */
162Object.isObject = function (obj) {
163 return obj !== null && typeof obj === "object";
164};
165/**
166 * 判断对象是否为 object 类型
167 *
168 * @param obj 任意对象
169 * @return boolean
170 */
171Object.isPlainObject = function (obj) {
172 return Object.prototype.toString.call(obj) === "[object Object]";
173};
174/**
175 * 判断对象是否为 Map 类型
176 *
177 * @param obj 任意对象
178 * @return boolean
179 */
180Object.isMap = function (obj) {
181 return Object.prototype.toString.call(obj) === "[object Map]";
182};
183/**
184 * 判断对象是否为 Set 类型
185 *
186 * @param obj 任意对象
187 * @return boolean
188 */
189Object.isSet = function (obj) {
190 return Object.prototype.toString.call(obj) === "[object Set]";
191};
192/**
193 * 判断对象是否为函数
194 *
195 * @param obj 任意对象
196 * @return boolean
197 */
198Object.isFunction = function (obj) {
199 return Object.type(obj) === "function";
200};
201/**
202 * 判断对象是否为 Symbol
203 *
204 * @param obj 任意对象
205 * @return boolean
206 */
207Object.isSymbol = function (obj) {
208 if (typeof obj === "symbol") {
209 return true;
210 }
211 try {
212 var toString_1 = Symbol.prototype.toString;
213 if (typeof obj.valueOf() !== "symbol") {
214 return false;
215 }
216 return /^Symbol\(.*\)$/.test(toString_1.call(obj));
217 }
218 catch (e) {
219 return false;
220 }
221};
222/**
223 * 判断对象是否为 Promise
224 *
225 * @param obj 任意对象
226 * @return boolean
227 */
228Object.isPromise = function (obj) {
229 return Object.isUndefinedOrNull(obj) === false && Object.isFunction(obj.then) && Object.isFunction(obj.catch);
230};
231/**
232 * 判断对象是否为原始类型
233 *
234 * @param obj 任意对象
235 * @return boolean
236 */
237Object.isPrimitive = function (obj) {
238 return Object.isBoolean(obj) || Object.isString(obj) || Object.isNumber(obj);
239};
240/**
241 * 判断对象是否为数组
242 *
243 * @param obj 任意对象
244 * @return boolean
245 */
246Object.isArray = function (obj) {
247 return Array.isArray(obj);
248};
249/**
250 * 判断对象是否为字符串对象
251 *
252 * @param obj 任意对象
253 * @return boolean
254 */
255Object.isString = function (obj) {
256 return Object.type(obj) === "string";
257};
258/**
259 * 判断对象是否为数字对象
260 *
261 * @param obj 任意对象
262 * @return boolean
263 */
264Object.isNumber = function (obj) {
265 return Object.type(obj) === "number";
266};
267/**
268 * 判断对象是否为布尔对象
269 *
270 * @param obj 任意对象
271 * @return boolean
272 */
273Object.isBoolean = function (obj) {
274 return Object.type(obj) === "boolean";
275};
276/**
277 * 判断对象是否为正则对象
278 *
279 * @param obj 任意对象
280 * @return boolean
281 */
282Object.isRegExp = function (obj) {
283 return Object.rawType(obj) === 'RegExp';
284};
285/**
286 * 判断对象是否为文件对象
287 *
288 * @param obj 任意对象
289 * @return boolean
290 */
291Object.isFile = function (obj) {
292 return obj instanceof File;
293};
294/**
295 * 判断对象是否为 windows 对象
296 *
297 * @param obj 任意对象
298 * @return boolean
299 */
300Object.isWindow = function (obj) {
301 return Object.isUndefinedOrNull(obj) && obj == obj.window;
302};
303/**
304 * 判断对象是否为 Element
305 *
306 * @param obj 任意对象
307 * @return boolean
308 */
309Object.isElement = function (obj) {
310 if (Object.isUndefinedOrNull(obj)) {
311 return false;
312 }
313 return !!(obj.nodeType == 1);
314};
315/**
316 * 判断对象是否为事件对象
317 *
318 * @param obj 任意对象
319 * @return boolean
320 */
321Object.isEvent = function (obj) {
322 return obj instanceof Event;
323};
324/**
325 * 判断对象是否为 null 对象
326 *
327 * @param obj 任意对象
328 * @return boolean
329 */
330Object.isNull = function (obj) {
331 return obj === null;
332};
333/**
334 * 判断对象是否为未定义
335 *
336 * @param obj 任意对象
337 * @return boolean
338 */
339Object.isUndefined = function (obj) {
340 return obj === undefined;
341};
342/**
343 * 判断对象是否为未定义或 null
344 *
345 * @param obj 任意对象
346 * @return boolean
347 */
348Object.isUndefinedOrNull = function (obj) {
349 return Object.isUndefined(obj) || Object.isNull(obj);
350};
351/**
352 * 判断两个对象是否相等
353 *
354 * @param obj1 一个对象
355 * @param obj2 用于和 obj1 比较的对象
356 * @return 当两个对象相等时,返回 true;否则,返回 false
357 */
358Object.equals = function (obj1, obj2) {
359 if (obj1 === obj2) {
360 return true;
361 }
362 else if (!(obj1 instanceof Object) || !(obj2 instanceof Object)) {
363 return false;
364 }
365 else if (obj1.constructor !== obj2.constructor) {
366 return false;
367 }
368 else if (Object.isArray(obj1) && Object.isArray(obj2) && obj1.length === obj2.length) {
369 for (var i = 0; i < obj1.length; i++) {
370 if (Object.equals(obj1[i], obj2[i]) === false) {
371 return false;
372 }
373 }
374 }
375 else if (Object.isObject(obj1) && Object.isObject(obj2) && Object.keys(obj1).length === Object.keys(obj2).length) {
376 for (var key in obj1) {
377 if (obj1.hasOwnProperty.call(key)) {
378 if (Object.equals(obj1[key], obj2[key]) === false) {
379 return false;
380 }
381 }
382 }
383 }
384 else {
385 return false;
386 }
387 return true;
388};
389/**
390 * 克隆对象
391 *
392 * @param obj 任意对象
393 * @return 新对象实例
394 */
395Object.clone = function (obj) {
396 if (Object.isString(obj)) {
397 return String(obj);
398 }
399 else if (Object.isArray(obj)) {
400 return Array.prototype.slice.apply(obj);
401 }
402 else if (Object.isPlainObject(obj)) {
403 var result_1 = Object.create(null);
404 Object.keys(obj).forEach(function (key) {
405 result_1[key] = Object.clone(obj[key]);
406 });
407 return result_1;
408 }
409 return obj;
410};
411/**
412 * 克隆对象,但需要删除指定属性
413 *
414 * @param obj 任意对象
415 * @param fields 需要删除的属性
416 * @return 新对象实例
417 */
418Object.omit = function (obj) {
419 var fields = [];
420 for (var _i = 1; _i < arguments.length; _i++) {
421 fields[_i - 1] = arguments[_i];
422 }
423 var result = Object.clone(obj);
424 for (var i = 0; i < fields.length; i++) {
425 var key = fields[i];
426 delete result[key];
427 }
428 return result;
429};
430
431/**
432 * Array 对象扩展
433 */
434/**
435 * 判断数组是否为空数组
436 *
437 * @return boolean
438 */
439Array.prototype.isEmpty = function () {
440 return this.length === 0;
441};
442/**
443 * 判断元素是否在数组中
444 *
445 * @param item 查找对象
446 * @return boolean
447 */
448Array.prototype.exists = function (item) {
449 return this.indexOf(item) !== -1;
450};
451/**
452 * 获取一个元素
453 *
454 * @return 第一个元素
455 */
456Array.prototype.first = function () {
457 if (this.length === 0) {
458 throw "Array index out of range: 0";
459 }
460 return this[0];
461};
462/**
463 * 获取一个元素
464 *
465 * @return 第一个元素
466 */
467Array.prototype.last = function () {
468 if (this.length === 0) {
469 throw "Array index out of range: 0";
470 }
471 return this[this.length - 1];
472};
473/**
474 * 数组迭代
475 *
476 * @param callback 回调函数
477 * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
478 */
479Array.prototype.each = Array.prototype.forEach;
480/**
481 * 获取数组大小
482 *
483 * @return 数组大小
484 */
485Array.prototype.size = function () {
486 return this.length;
487};
488/**
489 * 克隆数组
490 *
491 * @return 克隆结果
492 */
493Array.prototype.merge = Array.prototype.concat;
494/**
495 * 返回一个不包含 null/undefined 值元素的数组的新版本
496 *
497 * @return 不包含 null/undefined 值元素的数组的新版本
498 */
499Array.prototype.compact = function () {
500 return this.filter(function (value) { return Object.isUndefinedOrNull(value); });
501};
502/**
503 * 对数组的元素进行去重
504 *
505 * @return 数组元素进行去重后的新版本
506 */
507Array.prototype.unique = function () {
508 var temp = new Array();
509 return this.filter(function (v) {
510 var ret = temp.includes(v) === false;
511 temp.push(v);
512 return ret;
513 });
514};
515/**
516 * 返回不包括参数中任意一个指定值的数组
517 *
518 * @param values 排除值数组
519 * @return 不包括参数中任意一个指定值的数组
520 */
521Array.prototype.without = function () {
522 var values = [];
523 for (var _i = 0; _i < arguments.length; _i++) {
524 values[_i] = arguments[_i];
525 }
526 return this.filter(function (v) {
527 return values.includes(v) === false;
528 });
529};
530/**
531 * 克隆数组
532 *
533 * @return 克隆结果
534 */
535Array.prototype.clone = function () {
536 return this.slice(0);
537};
538/**
539 * 清空数组
540 *
541 * @return 空数组
542 */
543Array.prototype.clear = function () {
544 this.length = 0;
545 return this;
546};
547
548/**
549 * Date 对象扩展
550 */
551/**
552 * 判断是否为闰年
553 *
554 * @return boolean
555 */
556Date.prototype.isLeapYear = function () {
557 var year = this.getFullYear();
558 return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
559};
560/**
561 * 获取季节
562 *
563 * @return 季节
564 */
565Date.prototype.getSeason = function () {
566 var month = this.getMonth();
567 if (month >= 3 && month <= 5) {
568 return 0;
569 }
570 else if (month >= 6 && month <= 8) {
571 return 1;
572 }
573 else if (month >= 9 && month <= 11) {
574 return 2;
575 }
576 else if (month >= 12 || month <= 2) {
577 return 3;
578 }
579 else {
580 return 0;
581 }
582};
583/**
584 * 获取年份中的第几天
585 *
586 * @return 年份中的第几天
587 */
588Date.prototype.getDayOfYear = function () {
589 var month_days = this.isLeapYear() == true ? [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] : [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
590 var days = this.getDate();
591 for (var m = 0, month = this.getMonth(); m < month; m++) {
592 days += month_days[m];
593 }
594 return days;
595};
596/**
597 * 获取年份总天数
598 *
599 * @return 年份总天数
600 */
601Date.prototype.getDaysOfYear = function () {
602 return this.isLeapYear() ? 366 : 365;
603};
604/**
605 * Format a date object into a string value.
606 * @param format string - the desired format of the date
607 *
608 * The format can be combinations of the following:
609 *
610 * y - 年
611 * n - 季度(1 到 4)
612 * N - 季度名称
613 * A - 季度中文名称
614 * M - 月
615 * f - 月(Jan 到 Dec)
616 * F - 月(January 到 December)
617 * C - 月,中文名称
618 * d - 日
619 * Y - 年份中的第几天(0 到 365)
620 * T - 月份有几天(28 到 30)
621 * j - 每月天数后面的英文后缀(st,nd,rd 或者 th)
622 * e - 星期几,数字表示,0(表示星期天)到 6(表示星期六)
623 * E - 星期几,数字表示,1(表示星期一)到 7(表示星期天)
624 * l - 星期几,文本表示,3 个字母(Mon 到 Sun)
625 * L - 星期几,完整的文本格式(Sunday 到 Saturday)
626 * w - 星期几,中文名称
627 * W - 一月中第几个星期几
628 * i - 月份中的第几周
629 * o - 年份中的第几周
630 * h - 小时(1~12)
631 * H - 小时(0~23)
632 * m - 分
633 * s - 秒
634 * S - 毫秒
635 * a - 上午/下午标记
636 * O - 与格林威治时间相差的小时数
637 * P - 与格林威治时间相差的小时数,小时和分钟之间有冒号分隔
638 * Z - 时区
639 *
640 * @return 格式化后的日期时间
641 */
642Date.prototype.format = function (format) {
643 if (Object.isString(format) === false) {
644 throw "Invalid argument format";
645 }
646 var $this = this;
647 var _season_map = {
648 "N": ["Spring", "Summer", "Autumn", "Winter"],
649 "A": ["\u6625", "\u590f", "\u79cb", "\u51ac"]
650 };
651 var _month_map = {
652 "f": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
653 "F": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
654 "C": ["\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u4E03", "\u516B", "\u4E5D", "\u5341", "\u5341\u4E00", "\u5341\u4E8C"]
655 };
656 var _weekday_map = {
657 "W": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
658 "WW": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
659 "WC": ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D"]
660 };
661 var season = -1;
662 var seasonFn = function () { return Math.floor(($this.getMonth() + 3) / 3); };
663 var $funcs = {
664 // 年
665 "y": function (pattern) {
666 return ($this.getFullYear() + "").substring(4 - pattern.length);
667 },
668 // 季度(1 到 4)
669 "n": function () {
670 if (season === -1) {
671 season = seasonFn();
672 }
673 return season;
674 },
675 // 季度名称
676 "N": function () {
677 if (season === -1) {
678 season = seasonFn();
679 }
680 return _season_map["N"][season - 1];
681 },
682 // 季度中文名称
683 "A": function () {
684 if (season === -1) {
685 season = seasonFn();
686 }
687 return _season_map["A"][season - 1];
688 },
689 // 月
690 "M": function (pattern) {
691 var $month = $this.getMonth() + 1;
692 var result = $month < 10 ? "0" + $month : "" + $month;
693 return result.substring(2 - pattern.length);
694 },
695 // 月(Jan 到 Dec)
696 "f": function () {
697 var $month = $this.getMonth();
698 return _month_map["f"][$month];
699 },
700 // 月(January 到 December)
701 "F": function () {
702 var $month = $this.getMonth();
703 return _month_map["F"][$month];
704 },
705 // 月,中文名称
706 "C": function () {
707 var $month = $this.getMonth();
708 return _month_map["C"][$month];
709 },
710 // 星期数字,0 到 6 表示
711 "e": function () {
712 return $this.getDay();
713 },
714 // 星期数字,1 到 7 表示
715 "E": function () {
716 return $this.getDay() + 1;
717 },
718 // 星期英文缩写
719 "l": function () {
720 var $weekday = $this.getDay();
721 return _weekday_map["W"][$weekday];
722 },
723 // 星期英文全称
724 "L": function () {
725 var $weekday = $this.getDay();
726 return _weekday_map["WC"][$weekday];
727 },
728 // 星期中文名称
729 "w": function () {
730 var $weekday = $this.getDay();
731 return _weekday_map["WC"][$weekday];
732 },
733 // 日
734 "d": function (pattern) {
735 var $date = $this.getDate();
736 var result = $date < 10 ? "0" + $date : "" + $date;
737 return result.substring(2 - pattern.length);
738 },
739 // 小时
740 "h": function (pattern) {
741 var $hour = $this.getHours();
742 var result = $hour % 12 === 0 ? "12" : $hour % 12;
743 result = $hour < 10 ? "0" + $hour : "" + $hour;
744 return result.substring(2 - pattern.length);
745 },
746 // 小时
747 "H": function (pattern) {
748 var $hour = $this.getHours();
749 var result = $hour < 10 ? "0" + $hour : "" + $hour;
750 return result.substring(2 - pattern.length);
751 },
752 // 分钟
753 "m": function (pattern) {
754 var $minutes = $this.getMinutes();
755 var result = $minutes < 10 ? "0" + $minutes : "" + $minutes;
756 return result.substring(2 - pattern.length);
757 },
758 // 秒钟
759 "s": function (pattern) {
760 var $seconds = $this.getSeconds();
761 var result = $seconds < 10 ? "0" + $seconds : "" + $seconds;
762 return result.substring(2 - pattern.length);
763 },
764 // 毫秒
765 "S": function (pattern) {
766 var $mise = $this.getMilliseconds();
767 var result = $mise < 10 ? "0" + $mise : "" + $mise;
768 return result.substring(2 - pattern.length);
769 }
770 };
771 return format.replace(/([ynNAMfFCdYTjeElLwWiohHmsSaOPZ])+/g, function (all, t) {
772 var fn = $funcs[t];
773 return Object.isFunction(fn) === true ? fn(all) : all;
774 });
775};
776
777/**
778 * Document 对象扩展
779 */
780var SameSite;
781(function (SameSite) {
782 SameSite["NONE"] = "None";
783 SameSite["LAX"] = "Lax";
784 SameSite["STRICT"] = "Strict";
785})(SameSite || (SameSite = {}));
786var CookieInstance = /** @class */ (function () {
787 function CookieInstance() {
788 }
789 CookieInstance.prototype.set = function (name, value, options) {
790 var $name = name = encodeURIComponent(name)
791 .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent);
792 var $value = value ? encodeURIComponent(value)
793 .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent) : '';
794 var stringifiedAttributes = '';
795 if (options) {
796 stringifiedAttributes += options.domain ? '; domain=' + options.domain : '';
797 stringifiedAttributes += options.path ? '; path=' + options.path : '';
798 if (options.expires) {
799 var $expiresDate = options.expires instanceof Date ? options.expires : new Date(Date.now() + options.expires * 864e5);
800 stringifiedAttributes += options.expires ? '; expires=' + $expiresDate.toUTCString() : '';
801 }
802 stringifiedAttributes += options.sameSite ? '; sameSite=' + options.sameSite : '';
803 if (Object.isBoolean(options.secure) && options.secure) {
804 stringifiedAttributes += options.expires ? '; secure' : '';
805 }
806 if (Object.isBoolean(options.httpOnly) && options.httpOnly) {
807 stringifiedAttributes += options.httpOnly ? '; httpOnly' : '';
808 }
809 }
810 return document.cookie = $name + '=' + $value + stringifiedAttributes;
811 };
812 CookieInstance.prototype.get = function (name) {
813 var cookies = document.cookie ? document.cookie.split('; ') : [];
814 for (var i = 0; i < cookies.length; i++) {
815 var parts = cookies[i].split('=');
816 var $name = decodeURIComponent(parts[0]);
817 var $value = parts.slice(1).join('=');
818 if ($name === name) {
819 if ($value[0] === '"') {
820 $value = $value.slice(1, -1);
821 }
822 return $value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent);
823 }
824 }
825 return null;
826 };
827 CookieInstance.prototype.delete = function (name, options) {
828 var $options = options ? options : {};
829 $options.expires = -1;
830 this.set(name, '', $options);
831 };
832 return CookieInstance;
833}());
834/**
835 * 检测当前浏览器是否为全屏
836 *
837 * @return 当前浏览器是否为全屏
838 */
839Object.defineProperty(document, "fullScreen", {
840 value: Object.isUndefined(document.fullscreen) === false ? document.fullscreen : (Object.isUndefined(document.mozFullScreen) === false ? document.mozFullScreen : (Object.isUndefined(document.webkitIsFullScreen) === false ? document.webkitIsFullScreen : (Object.isUndefined(document.msFullScreen) === false ? document.msFullScreen : (Object.isUndefined(document.fullscreenElement) === false ? document.fullscreenElement !== null : (Object.isUndefined(document.mozFullScreenElement) === false ? document.mozFullScreenElement !== null : (Object.isUndefined(document.webkitFullscreenElement) === false ? document.webkitFullscreenElement !== null : (Object.isUndefined(document.msFullscreenElement) === false ? document.msFullscreenElement !== null : false))))))),
841 configurable: true,
842 writable: false
843});
844/**
845 * 检测当前浏览器是否支持全屏模式
846 *
847 * @return 当前浏览器是否支持全屏模式
848 */
849Object.defineProperty(document, "fullScreenEnabled", {
850 value: Object.isUndefined(document.mozFullScreenEnabled) === false ? document.mozFullScreenEnabled : (Object.isUndefined(document.webkitFullscreenEnabled) === false ? document.webkitFullscreenEnabled : (Object.isUndefined(document.msFullscreenEnabled) === false ? document.msFullscreenEnabled : (Object.isUndefined(document.fullscreenEnabled) === false ? document.fullscreenEnabled : false))),
851 configurable: true,
852 writable: false
853});
854/**
855 * 返回当前文档中正在以全屏模式显示的 Element 节点
856 *
857 * @return 当前文档中正在以全屏模式显示的 Element 节点
858 */
859Object.defineProperty(document, "fullScreenElement", {
860 value: Object.isUndefined(document.mozFullScreenElement) === false ? document.mozFullScreenElement : (Object.isUndefined(document.webkitFullscreenElement) === false ? document.webkitFullscreenElement : (Object.isUndefined(document.msFullscreenElement) === false ? document.msFullscreenElement : (Object.isUndefined(document.fullscreenElement) === false ? document.fullscreenElement : null))),
861 configurable: true,
862 writable: false
863});
864/**
865 * 返回 Cookie 对象
866 *
867 * @return Cookie 对象
868 */
869Object.defineProperty(document, "httpCookie", {
870 value: new CookieInstance(),
871 configurable: true,
872 writable: false
873});
874/**
875 * 请求进入全屏模式
876 *
877 * @return Promise
878 */
879Document.prototype.requestFullscreen = function () {
880 var doc = document.documentElement;
881 if (Object.isFunction(doc.mozRequestFullScreen)) {
882 return doc.mozRequestFullScreen();
883 }
884 else if (Object.isFunction(doc.webkitRequestFullscreen)) {
885 return doc.webkitRequestFullscreen();
886 }
887 else if (Object.isFunction(doc.msRequestFullscreen)) {
888 return doc.msRequestFullscreen();
889 }
890 else {
891 return doc.requestFullscreen();
892 }
893};
894/**
895 * 退出全屏模式
896 *
897 * @return Promise
898 */
899Document.prototype.exitFullscreen = function () {
900 if (Object.isFunction(document.mozCancelFullScreen)) {
901 return document.mozCancelFullScreen();
902 }
903 else if (Object.isFunction(document.mozExitFullScreen)) {
904 return document.mozExitFullScreen();
905 }
906 else if (Object.isFunction(document.webkitCancelFullScreen)) {
907 return document.webkitCancelFullScreen();
908 }
909 else if (Object.isFunction(document.webkitExitFullscreen)) {
910 return document.webkitExitFullscreen();
911 }
912 else if (Object.isFunction(document.msExitFullscreen)) {
913 return document.msExitFullscreen();
914 }
915 else {
916 return document.exitFullscreen();
917 }
918};
919
920/**
921 * Function 对象扩展
922 */
923/**
924 * 获取函数参数名称
925 *
926 * @return 函数参数名称列表
927 */
928Function.prototype.argumentNames = function () {
929 var method = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/);
930 if (method === null) {
931 return null;
932 }
933 var names = method[1].replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, "").replace(/\s+/g, "").split(", ");
934 return names.length === 1 && !names[0] ? [] : names;
935};
936/**
937 * 延时执行函数
938 *
939 * @param timeout 延时时间(单位:秒)
940 * @return mixed
941 */
942Function.prototype.delay = function (timeout) {
943 var __method = this;
944 var args = Array.prototype.slice.call(arguments, 1);
945 return window.setTimeout(__method.apply(__method, args), timeout * 1000);
946};
947
948/**
949 * Math 对象扩展
950 */
951/**
952 * 产生一个指定范围内的随机数
953 *
954 * @param min 返回的最低值(默认 0)
955 * @param max 返回的最高值
956 * @return 随机数
957 */
958Math.rand = function (min, max) {
959 min = min || 0;
960 max = max || Number.MAX_SAFE_INTEGER;
961 var rand = Math.random() * (max - min + 1) + min;
962 var result = Math.round(rand);
963 if (result < min) {
964 return min;
965 }
966 else if (result > max) {
967 return max;
968 }
969 else {
970 return result;
971 }
972};
973
974/**
975 * Number 对象扩展
976 */
977/**
978 * 数字填充
979 *
980 * @param length 长度
981 * @param radix 进制
982 * @return 填充后的字符串数字
983 */
984Number.prototype.toPaddedString = function (length, radix) {
985 var str = this.toString(radix || 10);
986 return "0".repeat(length - str.length) + str;
987};
988/**
989 * 判断数字是否为奇数
990 *
991 * @param num 需要判断的数字
992 * @return boolean 数字是为奇数返回 true;否则返回 false
993 */
994Number.isOdd = function (num) {
995 return num % 2 === 1;
996};
997/**
998 * 判断数字是否为偶数
999 *
1000 * @param num 需要判断的数字
1001 * @return boolean 数字是为偶数返回 true;否则返回 false
1002 */
1003Number.isEven = function (num) {
1004 return num % 2 === 0;
1005};
1006/**
1007 * 判断一个数字是否在另两个数字之间
1008 *
1009 * @param num 需要判断的数
1010 * @param min 最小值
1011 * @param max 最大值
1012 * @param match 是否包含最小值或最大值
1013 * @return boolean 数字是否在另两个数字之间,返回 true;否则返回 false
1014 */
1015Number.isBetween = function (num, min, max, match) {
1016 if (match === void 0) { match = false; }
1017 min = min || 0;
1018 max = max || 0;
1019 if (min > max) {
1020 min ^= max;
1021 max ^= min;
1022 min ^= max;
1023 }
1024 return match == true ? num >= min && num <= max : num > min && num < max;
1025};
1026
1027/**
1028 * String 对象扩展
1029 */
1030/**
1031 * 判断字符串是否存在
1032 *
1033 * @param str 子字符串
1034 * @return boolean
1035 */
1036String.prototype.exists = function (str) {
1037 return this.indexOf(str) >= 0;
1038};
1039/**
1040 * 判断字符串是否相等
1041 *
1042 * @param str 与此 String 进行比较的对象
1043 * @return boolean
1044 */
1045String.prototype.equals = function (str) {
1046 return Object.isUndefinedOrNull(str) == false && this === str;
1047};
1048/**
1049 * 判断字符串是否相等,不考虑大小写
1050 *
1051 * @param str 与此 String 进行比较的对象
1052 * @return boolean
1053 */
1054String.prototype.equalsIgnoreCase = function (str) {
1055 return str !== undefined && str !== null && this.toLowerCase() === str.toLowerCase();
1056};
1057/**
1058 * 判断是否为空字符串
1059 *
1060 * @return boolean
1061 */
1062String.prototype.isEmpty = function () {
1063 return this.length === 0;
1064};
1065/**
1066 * 判断是否不为空字符串
1067 *
1068 * @return boolean
1069 */
1070String.prototype.isNotEmpty = function () {
1071 return this.length > 0;
1072};
1073/**
1074 * 判断是否为空白字符串
1075 *
1076 * @return boolean
1077 */
1078String.prototype.isBlank = function () {
1079 return /^\s*$/.test(this.toString());
1080};
1081/**
1082 * 重复一个字符串
1083 *
1084 * @papram count 重复次数
1085 * @return 重复后的字符串
1086 */
1087String.prototype.repeat = function (count) {
1088 if (count < 1) {
1089 return "";
1090 }
1091 else {
1092 var s = this.toString();
1093 var result = s;
1094 for (var i = 0; i < count; i++) {
1095 result += s;
1096 }
1097 return result;
1098 }
1099};
1100/**
1101 * 截取字符串左边边指定数目的字符串
1102 *
1103 * @param length 截取长度
1104 * @return 子字符串
1105 */
1106String.prototype.left = function (length) {
1107 return this.substring(0, length);
1108};
1109/**
1110 * 截取字符串右边指定数目的字符串
1111 *
1112 * @param length 截取长度
1113 * @return 子字符串
1114 */
1115String.prototype.right = function (length) {
1116 return this.substring(this.length - length, this.length);
1117};
1118/**
1119 * 截取字符串,超出部分用 truncation 替代
1120 *
1121 * @param length 截取长度
1122 * @param truncation 替换字符串
1123 * @return 截取后的字符串
1124 * 实际截取长度:当 length 小于等于 truncation 的长度时为,length;当 length 大于 truncation 的长度时为,length - truncation.length
1125 */
1126String.prototype.truncation = function (length, truncation) {
1127 if (truncation === void 0) { truncation = '...'; }
1128 truncation = truncation || "...";
1129 return this.length > length ? this.slice(0, length <= truncation.length ? length : length - truncation.length) + truncation : String(this);
1130};
1131/**
1132 * 删除字符串开头的空白字符
1133 *
1134 * @return 删除了字符串最左边的空白字符的字符串
1135 */
1136String.prototype.ltrim = function () {
1137 return Object.isFunction(this.trimStart) ? this.trimStart() : this.replace(/^\s*/g, "");
1138};
1139/**
1140 * 删除字符串结尾的空白字符
1141 *
1142 * @return 删除了字符串最右边的空白字符的字符串
1143 */
1144String.prototype.rtrim = function () {
1145 return Object.isFunction(this.trimEnd) ? this.trimEnd() : this.replace(/\s*$/g, "");
1146};
1147/**
1148 * 判断字符串是否以给定的字符串开头
1149 *
1150 * @param str 搜索的字符串
1151 * @return boolean
1152 */
1153String.prototype.startsWith = function (str) {
1154 return this.indexOf(str) === 0;
1155};
1156/**
1157 * 判断字符串是否以给定的字符串结尾
1158 *
1159 * @param str 搜索的字符串
1160 * @return boolean
1161 */
1162String.prototype.endsWith = function (str) {
1163 var d = this.length - str.length;
1164 return d >= 0 && this.lastIndexOf(str) === d;
1165};
1166/**
1167 * 首字母小写
1168 *
1169 * @return 结果字符串
1170 */
1171String.prototype.lcfirst = function () {
1172 return this.charAt(0).toLowerCase() + this.substring(1);
1173};
1174/**
1175 * 首字母大写
1176 *
1177 * @return 结果字符串
1178 */
1179String.prototype.ucfirst = function () {
1180 return this.charAt(0).toUpperCase() + this.substring(1);
1181};
1182/**
1183 * 将 HTML 编码
1184 *
1185 * @return 编码后的字符串
1186 */
1187String.prototype.escapeHTML = function () {
1188 return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
1189};
1190/**
1191 * 将 HTML 实体字符解码
1192 *
1193 * @return 解码后的字符串
1194 */
1195String.prototype.unescapeHTML = function () {
1196 return this.replace(/&quot;/g, '"').replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
1197};
1198/**
1199 * 删除 HTML 标签
1200 *
1201 * @param tag HTML 标签
1202 * @returns 删除标签后的字符串
1203 */
1204String.prototype.stripTag = function (tag) {
1205 return this.replace(new RegExp("<" + tag + "(\\s+(\"[^\"]*\"|'[^']*'|[^>])+)?(\/)?>|<\/" + tag + ">", "gi"), "");
1206};
1207/**
1208 * 批量删除 HTML 标签
1209 *
1210 * @param tags 删除指定的标签
1211 * @return 删除标签后的字符串
1212 */
1213String.prototype.stripTags = function (tags) {
1214 if (typeof tags === "string") {
1215 return this.stripTag(tags);
1216 }
1217 else if (Array.isArray(tags)) {
1218 var result = this.toString();
1219 for (var i = 0; i < tags.length; i++) {
1220 result = result.stripTag(tags[i]);
1221 }
1222 return result;
1223 }
1224 else {
1225 return this.toString();
1226 }
1227};
1228/**
1229 * 删除 script 标签
1230 *
1231 * @return 删除 script 标签后的字符串
1232 */
1233String.prototype.stripScripts = function () {
1234 return this.replace(/<script[^>]*>([\S\s]*?)<\/script>/img, "");
1235};
1236/**
1237 * 将字符串转换为数组
1238 *
1239 * @param delimiter 分隔字符
1240 * @return 数组
1241 */
1242String.prototype.toArray = function (delimiter) {
1243 return this.split(delimiter || "");
1244};
1245/**
1246 * 返回一个数组的字符串表示形式
1247 *
1248 * @param useDoubleQuotes 是否使用双引号引住
1249 * @return 后的字符串
1250 */
1251String.prototype.inspect = function (useDoubleQuotes) {
1252 var specialChar = { '\b': '\\b', '\t': '\\t', '\r': '\\r', '\n': '\\n', '\f': '\\f', '\\': '\\\\' };
1253 var escapedString = this.replace(/[\x00-\x1f\\]/g, function (character) {
1254 if (character in specialChar) {
1255 return specialChar[character];
1256 }
1257 return '\\u00' + character.charCodeAt(0).toPaddedString(2, 16);
1258 });
1259 if (useDoubleQuotes) {
1260 return '"' + escapedString.replace(/"/g, '\\"') + '"';
1261 }
1262 else {
1263 return "'" + escapedString.replace(/'/g, '\\\'') + "'";
1264 }
1265};
1266/**
1267 * 获取字符串 hash code
1268 *
1269 * @return 字符串 hash code
1270 */
1271String.prototype.hashCode = function () {
1272 var result = 0;
1273 if (result === 0 && this.length > 0) {
1274 for (var i = 0; i < this.length; i++) {
1275 result = 31 * result + this.charCodeAt(i);
1276 }
1277 }
1278 return result;
1279};
1280/**
1281 * 生成随机字符串
1282 *
1283 * @param length 生成字符串的长度
1284 * @param type 生成类型
1285 * NUMERIC - 数字随机字符串
1286 * LETTER - 英文随机字符串
1287 * LETTER_NUMERIC - 英文数字混合随机字符串
1288 * CHINESE - 中文随机字符串
1289 *
1290 * @return 生成结果
1291 */
1292String.random = function (length, type) {
1293 if (type === void 0) { type = "LETTER_NUMERIC"; }
1294 var result = "";
1295 if (type === "CHINESE") {
1296 for (var i = 0; i < length; i++) {
1297 result += String.fromCharCode(Math.rand(19968, 40891));
1298 }
1299 return result;
1300 }
1301 var numeric = "0123456789";
1302 var letter = "abcdefghijklmnopqrstuvwxyz";
1303 var map = {
1304 "NUMERIC": numeric,
1305 "LETTER": letter + letter.toUpperCase(),
1306 "LETTER_NUMERIC": numeric + letter + letter.toUpperCase()
1307 };
1308 if (!map[type]) {
1309 throw "Invalid argument type value, must be: NUMERIC, LETTER, LETTER_NUMERIC or CHINESE";
1310 }
1311 for (var j = 0; j < length; j++) {
1312 result += map[type].charAt(Math.rand(0, map[type].length - 1));
1313 }
1314 return result;
1315};
1316
1317/**
1318 * Window 对象扩展
1319 */
1320Object.defineProperty(window, "browser", {
1321 value: {
1322 userAgent: navigator.userAgent,
1323 name: navigator.appName,
1324 version: navigator.appVersion,
1325 isMobile: ["Android", "iPhone", "iPod", "Windows Phone", "Mobile", "Coolpad", "mmp", "SmartPhone", "midp", "wap", "xoom", "Symbian", "J2ME", "Blackberry", "Wince"].some(function (value) { return navigator.userAgent.exists(value); }),
1326 isChrome: /\(KHTML, like Gecko\) Chrome\//.test(navigator.userAgent),
1327 isFirefox: navigator.userAgent.exists("Firefox"),
1328 isMozilla: navigator.userAgent.exists("Mozilla"),
1329 isEdge: navigator.userAgent.exists("Edge"),
1330 isMSIE: navigator.userAgent.exists("MSIE") && navigator.userAgent.exists("compatible"),
1331 isOpera: navigator.userAgent.exists("Opera"),
1332 isSafari: navigator.userAgent.exists("Safari"),
1333 isNetscape: /Netscape([\d]*)\/([^\s]+)/i.test(navigator.userAgent)
1334 },
1335 configurable: true,
1336 writable: false
1337});
1338/**
1339 * 将字符串复制到剪贴板
1340 *
1341 * @param str 字符串
1342 */
1343Window.prototype.copy = function (str) {
1344 try {
1345 if (Object.isObject(this.clipboardData)) {
1346 this.clipboardData.setData("text", str);
1347 }
1348 else {
1349 var fakeElement = document.createElement("textarea");
1350 fakeElement.style.border = "none";
1351 fakeElement.style.margin = "0";
1352 fakeElement.style.padding = "0";
1353 fakeElement.style.position = "absolute";
1354 fakeElement.style.top = "-9999px";
1355 fakeElement.style.left = "-9999px";
1356 fakeElement.value = str;
1357 fakeElement.setAttribute("readonly", "");
1358 document.body.appendChild(fakeElement);
1359 fakeElement.setSelectionRange(0, str.length);
1360 fakeElement.select();
1361 document.execCommand("copy");
1362 fakeElement.remove();
1363 }
1364 }
1365 catch (e) {
1366 console.error(e);
1367 }
1368};
1369/**
1370 * 获取所有的请求参数及值
1371 *
1372 * @return 所有的请求参数及值
1373 */
1374Location.prototype.getParameters = function () {
1375 var queryString = this.search;
1376 var parameters = {};
1377 if (queryString.indexOf("?") != -1) {
1378 queryString = queryString.substring(1);
1379 var parts = queryString.split("&");
1380 for (var i = 0; i < parts.length; i++) {
1381 var temp = parts[i].split("=");
1382 var val = temp.length == 2 ? encodeURIComponent(temp[1]) : "";
1383 if (Object.isUndefined(parameters[temp[0]])) {
1384 parameters[temp[0]] = val;
1385 }
1386 else {
1387 if (Object.isArray(parameters[temp[0]]) == false) {
1388 var oldVal = parameters[temp[0]];
1389 delete parameters[temp[0]];
1390 parameters[temp[0]] = [oldVal];
1391 }
1392 parameters[temp[0]].push(val);
1393 }
1394 }
1395 }
1396 return parameters;
1397};
1398/**
1399 * 获取指定请求参数的值
1400 *
1401 * @param name 参数名
1402 * @return 指定请求参数的值
1403 */
1404Location.prototype.getParameter = function (name) {
1405 var parameters = this.getParameters();
1406 return parameters[name];
1407};
1408//# sourceMappingURL=prototype.esm.js.map