@whitesev/domutils 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1728 @@
1
+ System.register('DOMUtils', [], (function (exports) {
2
+ 'use strict';
3
+ return {
4
+ execute: (function () {
5
+
6
+ const DOMUtilsCoreDefaultEnv = {
7
+ document: document,
8
+ window: window,
9
+ globalThis: globalThis,
10
+ self: self,
11
+ };
12
+ const DOMUtilsCoreEnv = {
13
+ document: document,
14
+ window: window,
15
+ globalThis: globalThis,
16
+ self: self,
17
+ };
18
+ const DOMUtilsCore = {
19
+ init(option) {
20
+ if (!option) {
21
+ option = Object.assign({}, DOMUtilsCoreDefaultEnv);
22
+ }
23
+ Object.assign(DOMUtilsCoreEnv, option);
24
+ },
25
+ get document() {
26
+ return DOMUtilsCoreEnv.document;
27
+ },
28
+ get window() {
29
+ return DOMUtilsCoreEnv.window;
30
+ },
31
+ get globalThis() {
32
+ return DOMUtilsCoreEnv.globalThis;
33
+ },
34
+ get self() {
35
+ return DOMUtilsCoreEnv.self;
36
+ },
37
+ };
38
+
39
+ /** 通用工具类 */
40
+ const CommonDOMUtils = {
41
+ /**
42
+ * 判断元素是否已显示或已连接
43
+ * @param element
44
+ */
45
+ isShow(element) {
46
+ return Boolean(element.getClientRects().length);
47
+ },
48
+ /**
49
+ * 用于显示元素并获取它的高度宽度等其它属性
50
+ * @param element
51
+ */
52
+ showElement(element) {
53
+ let dupNode = element.cloneNode(true);
54
+ dupNode.setAttribute("style", "visibility: hidden !important;display:block !important;");
55
+ DOMUtilsCore.document.documentElement.appendChild(dupNode);
56
+ return {
57
+ /**
58
+ * 恢复修改的style
59
+ */
60
+ recovery() {
61
+ dupNode.remove();
62
+ },
63
+ };
64
+ },
65
+ /**
66
+ * 获取元素上的Float格式的属性px
67
+ * @param element
68
+ * @param styleName style名
69
+ */
70
+ getStyleValue(element, styleName) {
71
+ let view = null;
72
+ let styles = null;
73
+ if (element instanceof CSSStyleDeclaration) {
74
+ /* 直接就获取了style属性 */
75
+ styles = element;
76
+ }
77
+ else {
78
+ view = element.ownerDocument.defaultView;
79
+ if (!view || !view.opener) {
80
+ view = window;
81
+ }
82
+ styles = view.getComputedStyle(element);
83
+ }
84
+ let value = parseFloat(styles[styleName]);
85
+ if (isNaN(value)) {
86
+ return 0;
87
+ }
88
+ else {
89
+ return value;
90
+ }
91
+ },
92
+ /**
93
+ * 判断是否是window,例如window、self、globalThis
94
+ * @param target
95
+ */
96
+ isWin(target) {
97
+ if (typeof target !== "object") {
98
+ return false;
99
+ }
100
+ if (target instanceof Node) {
101
+ return false;
102
+ }
103
+ if (target === globalThis) {
104
+ return true;
105
+ }
106
+ if (target === window) {
107
+ return true;
108
+ }
109
+ if (target === self) {
110
+ return true;
111
+ }
112
+ if (typeof unsafeWindow !== "undefined" && target === unsafeWindow) {
113
+ return true;
114
+ }
115
+ if (target?.Math?.toString() !== "[object Math]") {
116
+ return false;
117
+ }
118
+ return true;
119
+ },
120
+ /**
121
+ * 删除对象上的属性
122
+ * @param target
123
+ * @param propName
124
+ */
125
+ delete(target, propName) {
126
+ if (typeof Reflect === "object" && Reflect.deleteProperty) {
127
+ Reflect.deleteProperty(target, propName);
128
+ }
129
+ else {
130
+ delete target[propName];
131
+ }
132
+ },
133
+ };
134
+
135
+ /* 数据 */
136
+ const DOMUtilsData = {
137
+ /** .on绑定的事件 */
138
+ SymbolEvents: Symbol("events_" + (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)),
139
+ };
140
+
141
+ const OriginPrototype = {
142
+ Object: {
143
+ defineProperty: Object.defineProperty,
144
+ },
145
+ };
146
+
147
+ class DOMUtils {
148
+ constructor(option) {
149
+ DOMUtilsCore.init(option);
150
+ }
151
+ /** 版本号 */
152
+ version = "2024.5.24";
153
+ attr(element, attrName, attrValue) {
154
+ if (typeof element === "string") {
155
+ element = DOMUtilsCore.document.querySelector(element);
156
+ }
157
+ if (element == null) {
158
+ return;
159
+ }
160
+ if (attrValue == null) {
161
+ return element.getAttribute(attrName);
162
+ }
163
+ else {
164
+ element.setAttribute(attrName, attrValue);
165
+ }
166
+ }
167
+ /**
168
+ * 创建元素
169
+ * @param tagName 标签名
170
+ * @param property 属性
171
+ * @param attributes 元素上的自定义属性
172
+ * @example
173
+ * // 创建一个DIV元素,且属性class为xxx
174
+ * DOMUtils.createElement("div",undefined,{ class:"xxx" });
175
+ * > <div class="xxx"></div>
176
+ * @example
177
+ * // 创建一个DIV元素
178
+ * DOMUtils.createElement("div");
179
+ * > <div></div>
180
+ * @example
181
+ * // 创建一个DIV元素
182
+ * DOMUtils.createElement("div","测试");
183
+ * > <div>测试</div>
184
+ */
185
+ createElement(
186
+ /** 元素名 */
187
+ tagName,
188
+ /** 属性 */
189
+ property,
190
+ /** 自定义属性 */
191
+ attributes) {
192
+ let tempElement = DOMUtilsCore.document.createElement(tagName);
193
+ if (typeof property === "string") {
194
+ tempElement.innerHTML = property;
195
+ return tempElement;
196
+ }
197
+ if (property == null) {
198
+ property = {};
199
+ }
200
+ if (attributes == null) {
201
+ attributes = {};
202
+ }
203
+ Object.keys(property).forEach((key) => {
204
+ let value = property[key];
205
+ tempElement[key] = value;
206
+ });
207
+ Object.keys(attributes).forEach((key) => {
208
+ let value = attributes[key];
209
+ if (typeof value === "object") {
210
+ /* object转字符串 */
211
+ value = JSON.stringify(value);
212
+ }
213
+ else if (typeof value === "function") {
214
+ /* function转字符串 */
215
+ value = value.toString();
216
+ }
217
+ tempElement.setAttribute(key, value);
218
+ });
219
+ return tempElement;
220
+ }
221
+ css(element, property, value) {
222
+ /**
223
+ * 把纯数字没有px的加上
224
+ */
225
+ function handlePixe(propertyName, propertyValue) {
226
+ let allowAddPixe = [
227
+ "width",
228
+ "height",
229
+ "top",
230
+ "left",
231
+ "right",
232
+ "bottom",
233
+ "font-size",
234
+ ];
235
+ if (typeof propertyValue === "number") {
236
+ propertyValue = propertyValue.toString();
237
+ }
238
+ if (typeof propertyValue === "string" &&
239
+ allowAddPixe.includes(propertyName) &&
240
+ propertyValue.match(/[0-9]$/gi)) {
241
+ propertyValue = propertyValue + "px";
242
+ }
243
+ return propertyValue;
244
+ }
245
+ if (typeof element === "string") {
246
+ element = DOMUtilsCore.document.querySelector(element);
247
+ }
248
+ if (element == null) {
249
+ return;
250
+ }
251
+ if (typeof property === "string") {
252
+ if (value == null) {
253
+ return getComputedStyle(element).getPropertyValue(property);
254
+ }
255
+ else {
256
+ if (value === "string" && value.includes("!important")) {
257
+ element.style.setProperty(property, value, "important");
258
+ }
259
+ else {
260
+ value = handlePixe(property, value);
261
+ element.style.setProperty(property, value);
262
+ }
263
+ }
264
+ }
265
+ else if (typeof property === "object") {
266
+ for (let prop in property) {
267
+ if (typeof property[prop] === "string" &&
268
+ property[prop].includes("!important")) {
269
+ element.style.setProperty(prop, property[prop], "important");
270
+ }
271
+ else {
272
+ property[prop] = handlePixe(prop, property[prop]);
273
+ element.style.setProperty(prop, property[prop]);
274
+ }
275
+ }
276
+ }
277
+ }
278
+ text(element, text) {
279
+ if (typeof element === "string") {
280
+ element = DOMUtilsCore.document.querySelector(element);
281
+ }
282
+ if (element == null) {
283
+ return;
284
+ }
285
+ if (text == null) {
286
+ return element.textContent || element.innerText;
287
+ }
288
+ else {
289
+ if (text instanceof Node) {
290
+ text = text.textContent || text.innerText;
291
+ }
292
+ if ("textContent" in element) {
293
+ element.textContent = text;
294
+ }
295
+ else if ("innerText" in element) {
296
+ element.innerText = text;
297
+ }
298
+ }
299
+ }
300
+ html(element, html) {
301
+ if (typeof element === "string") {
302
+ element = DOMUtilsCore.document.querySelector(element);
303
+ }
304
+ if (element == null) {
305
+ return;
306
+ }
307
+ if (html == null) {
308
+ return element.innerHTML;
309
+ }
310
+ else {
311
+ if (html instanceof Node) {
312
+ html = html.innerHTML;
313
+ }
314
+ if ("innerHTML" in element) {
315
+ element.innerHTML = html;
316
+ }
317
+ }
318
+ }
319
+ /**
320
+ * 绑定或触发元素的click事件
321
+ * @param element 目标元素
322
+ * @param handler (可选)事件处理函数
323
+ * @param details (可选)赋予触发的Event的额外属性
324
+ * @param useDispatchToTriggerEvent (可选)是否使用dispatchEvent来触发事件,默认true
325
+ * @example
326
+ * // 触发元素a.xx的click事件
327
+ * DOMUtils.click(document.querySelector("a.xx"))
328
+ * DOMUtils.click("a.xx")
329
+ * DOMUtils.click("a.xx",function(){
330
+ * console.log("触发click事件成功")
331
+ * })
332
+ * */
333
+ click(element, handler, details, useDispatchToTriggerEvent) {
334
+ let DOMUtilsContext = this;
335
+ if (typeof element === "string") {
336
+ element = DOMUtilsCore.document.querySelector(element);
337
+ }
338
+ if (element == null) {
339
+ return;
340
+ }
341
+ if (handler == null) {
342
+ DOMUtilsContext.trigger(element, "click", details, useDispatchToTriggerEvent);
343
+ }
344
+ else {
345
+ DOMUtilsContext.on(element, "click", null, handler);
346
+ }
347
+ }
348
+ /**
349
+ * 绑定或触发元素的blur事件
350
+ * @param element 目标元素
351
+ * @param handler (可选)事件处理函数
352
+ * @param details (可选)赋予触发的Event的额外属性
353
+ * @param useDispatchToTriggerEvent (可选)是否使用dispatchEvent来触发事件,默认true
354
+ * @example
355
+ * // 触发元素a.xx的blur事件
356
+ * DOMUtils.blur(document.querySelector("a.xx"))
357
+ * DOMUtils.blur("a.xx")
358
+ * DOMUtils.blur("a.xx",function(){
359
+ * console.log("触发blur事件成功")
360
+ * })
361
+ * */
362
+ blur(element, handler, details, useDispatchToTriggerEvent) {
363
+ let DOMUtilsContext = this;
364
+ if (typeof element === "string") {
365
+ element = DOMUtilsCore.document.querySelector(element);
366
+ }
367
+ if (element == null) {
368
+ return;
369
+ }
370
+ if (handler === null) {
371
+ DOMUtilsContext.trigger(element, "blur", details, useDispatchToTriggerEvent);
372
+ }
373
+ else {
374
+ DOMUtilsContext.on(element, "blur", null, handler);
375
+ }
376
+ }
377
+ /**
378
+ * 绑定或触发元素的focus事件
379
+ * @param element 目标元素
380
+ * @param handler (可选)事件处理函数
381
+ * @param details (可选)赋予触发的Event的额外属性
382
+ * @param useDispatchToTriggerEvent (可选)是否使用dispatchEvent来触发事件,默认true
383
+ * @example
384
+ * // 触发元素a.xx的focus事件
385
+ * DOMUtils.focus(document.querySelector("a.xx"))
386
+ * DOMUtils.focus("a.xx")
387
+ * DOMUtils.focus("a.xx",function(){
388
+ * console.log("触发focus事件成功")
389
+ * })
390
+ * */
391
+ focus(element, handler, details, useDispatchToTriggerEvent) {
392
+ let DOMUtilsContext = this;
393
+ if (typeof element === "string") {
394
+ element = DOMUtilsCore.document.querySelector(element);
395
+ }
396
+ if (element == null) {
397
+ return;
398
+ }
399
+ if (handler == null) {
400
+ DOMUtilsContext.trigger(element, "focus", details, useDispatchToTriggerEvent);
401
+ }
402
+ else {
403
+ DOMUtilsContext.on(element, "focus", null, handler);
404
+ }
405
+ }
406
+ /**
407
+ * 获取移动元素的transform偏移
408
+ */
409
+ getTransform(element, isShow = false) {
410
+ let DOMUtilsContext = this;
411
+ let transform_left = 0;
412
+ let transform_top = 0;
413
+ if (!(isShow || (!isShow && CommonDOMUtils.isShow(element)))) {
414
+ /* 未显示 */
415
+ let { recovery } = CommonDOMUtils.showElement(element);
416
+ let transformInfo = DOMUtilsContext.getTransform(element, true);
417
+ recovery();
418
+ return transformInfo;
419
+ }
420
+ let elementTransform = getComputedStyle(element).transform;
421
+ if (elementTransform != null &&
422
+ elementTransform !== "none" &&
423
+ elementTransform !== "") {
424
+ let elementTransformSplit = elementTransform
425
+ .match(/\((.+)\)/)?.[1]
426
+ .split(",");
427
+ if (elementTransformSplit) {
428
+ transform_left = Math.abs(parseInt(elementTransformSplit[4]));
429
+ transform_top = Math.abs(parseInt(elementTransformSplit[5]));
430
+ }
431
+ else {
432
+ transform_left = 0;
433
+ transform_top = 0;
434
+ }
435
+ }
436
+ return {
437
+ transformLeft: transform_left,
438
+ transformTop: transform_top,
439
+ };
440
+ }
441
+ val(element, value) {
442
+ if (typeof element === "string") {
443
+ element = DOMUtilsCore.document.querySelector(element);
444
+ }
445
+ if (element == null) {
446
+ return;
447
+ }
448
+ if (value == null) {
449
+ if (element.localName === "input" &&
450
+ (element.type === "checkbox" || element.type === "radio")) {
451
+ return element.checked;
452
+ }
453
+ else {
454
+ return element.value;
455
+ }
456
+ }
457
+ else {
458
+ if (element.localName === "input" &&
459
+ (element.type === "checkbox" || element.type === "radio")) {
460
+ element.checked = !!value;
461
+ }
462
+ else {
463
+ element.value = value;
464
+ }
465
+ }
466
+ }
467
+ prop(element, propName, propValue) {
468
+ if (element == null) {
469
+ return;
470
+ }
471
+ if (typeof element === "string") {
472
+ element = DOMUtilsCore.document.querySelector(element);
473
+ }
474
+ if (propValue == null) {
475
+ return element[propName];
476
+ }
477
+ else {
478
+ element[propName] = propValue;
479
+ }
480
+ }
481
+ /**
482
+ * 移除元素的属性
483
+ * @param element 目标元素
484
+ * @param attrName 属性名
485
+ * @example
486
+ * // 移除元素a.xx的属性data-value
487
+ * DOMUtils.removeAttr(document.querySelector("a.xx"),"data-value")
488
+ * DOMUtils.removeAttr("a.xx","data-value")
489
+ * */
490
+ removeAttr(element, attrName) {
491
+ if (typeof element === "string") {
492
+ element = DOMUtilsCore.document.querySelector(element);
493
+ }
494
+ if (element == null) {
495
+ return;
496
+ }
497
+ element.removeAttribute(attrName);
498
+ }
499
+ /**
500
+ * 移除元素class名
501
+ * @param element 目标元素
502
+ * @param className 类名
503
+ * @example
504
+ * // 移除元素a.xx的className为xx
505
+ * DOMUtils.removeClass(document.querySelector("a.xx"),"xx")
506
+ * DOMUtils.removeClass("a.xx","xx")
507
+ */
508
+ removeClass(element, className) {
509
+ if (typeof element === "string") {
510
+ element = DOMUtilsCore.document.querySelector(element);
511
+ }
512
+ if (element == null) {
513
+ return;
514
+ }
515
+ if (className == null) {
516
+ return;
517
+ }
518
+ element.classList.remove(className);
519
+ }
520
+ /**
521
+ * 移除元素的属性
522
+ * @param element 目标元素
523
+ * @param propName 属性名
524
+ * @example
525
+ * // 移除元素a.xx的href属性
526
+ * DOMUtils.removeProp(document.querySelector("a.xx"),"href")
527
+ * DOMUtils.removeProp("a.xx","href")
528
+ * */
529
+ removeProp(element, propName) {
530
+ if (typeof element === "string") {
531
+ element = DOMUtilsCore.document.querySelector(element);
532
+ }
533
+ if (element == null) {
534
+ return;
535
+ }
536
+ CommonDOMUtils.delete(element, propName);
537
+ }
538
+ /**
539
+ * 将一个元素替换为另一个元素
540
+ * @param element 目标元素
541
+ * @param newElement 新元素
542
+ * @example
543
+ * // 替换元素a.xx为b.xx
544
+ * DOMUtils.replaceWith(document.querySelector("a.xx"),document.querySelector("b.xx"))
545
+ * DOMUtils.replaceWith("a.xx",'<b class="xx"></b>')
546
+ */
547
+ replaceWith(element, newElement) {
548
+ let DOMUtilsContext = this;
549
+ if (typeof element === "string") {
550
+ element = DOMUtilsCore.document.querySelector(element);
551
+ }
552
+ if (element == null) {
553
+ return;
554
+ }
555
+ if (typeof newElement === "string") {
556
+ newElement = DOMUtilsContext.parseHTML(newElement, false, false);
557
+ }
558
+ if (element instanceof NodeList || element instanceof Array) {
559
+ element.forEach((item) => {
560
+ DOMUtilsContext.replaceWith(item, newElement);
561
+ });
562
+ }
563
+ else {
564
+ element.parentElement.replaceChild(newElement, element);
565
+ }
566
+ }
567
+ /**
568
+ * 给元素添加class
569
+ * @param element 目标元素
570
+ * @param className class名
571
+ * @example
572
+ * // 元素a.xx的className添加_vue_
573
+ * DOMUtils.addClass(document.querySelector("a.xx"),"_vue_")
574
+ * DOMUtils.addClass("a.xx","_vue_")
575
+ * */
576
+ addClass(element, className) {
577
+ if (typeof element === "string") {
578
+ element = DOMUtilsCore.document.querySelector(element);
579
+ }
580
+ if (element == null) {
581
+ return;
582
+ }
583
+ element.classList.add(className);
584
+ }
585
+ /**
586
+ * 函数在元素内部末尾添加子元素或HTML字符串
587
+ * @param element 目标元素
588
+ * @param content 子元素或HTML字符串
589
+ * @example
590
+ * // 元素a.xx的内部末尾添加一个元素
591
+ * DOMUtils.append(document.querySelector("a.xx"),document.querySelector("b.xx"))
592
+ * DOMUtils.append("a.xx","'<b class="xx"></b>")
593
+ * */
594
+ append(element, content) {
595
+ if (typeof element === "string") {
596
+ element = DOMUtilsCore.document.querySelector(element);
597
+ }
598
+ if (element == null) {
599
+ return;
600
+ }
601
+ if (typeof content === "string") {
602
+ element.insertAdjacentHTML("beforeend", content);
603
+ }
604
+ else {
605
+ element.appendChild(content);
606
+ }
607
+ }
608
+ /**
609
+ * 函数 在元素内部开头添加子元素或HTML字符串
610
+ * @param element 目标元素
611
+ * @param content 子元素或HTML字符串
612
+ * @example
613
+ * // 元素a.xx内部开头添加一个元素
614
+ * DOMUtils.prepend(document.querySelector("a.xx"),document.querySelector("b.xx"))
615
+ * DOMUtils.prepend("a.xx","'<b class="xx"></b>")
616
+ * */
617
+ prepend(element, content) {
618
+ if (typeof element === "string") {
619
+ element = DOMUtilsCore.document.querySelector(element);
620
+ }
621
+ if (element == null) {
622
+ return;
623
+ }
624
+ if (typeof content === "string") {
625
+ element.insertAdjacentHTML("afterbegin", content);
626
+ }
627
+ else {
628
+ element.insertBefore(content, element.firstChild);
629
+ }
630
+ }
631
+ /**
632
+ * 在元素后面添加兄弟元素或HTML字符串
633
+ * @param element 目标元素
634
+ * @param content 兄弟元素或HTML字符串
635
+ * @example
636
+ * // 元素a.xx后面添加一个元素
637
+ * DOMUtils.after(document.querySelector("a.xx"),document.querySelector("b.xx"))
638
+ * DOMUtils.after("a.xx","'<b class="xx"></b>")
639
+ * */
640
+ after(element, content) {
641
+ if (typeof element === "string") {
642
+ element = DOMUtilsCore.document.querySelector(element);
643
+ }
644
+ if (element == null) {
645
+ return;
646
+ }
647
+ if (typeof content === "string") {
648
+ element.insertAdjacentHTML("afterend", content);
649
+ }
650
+ else {
651
+ element.parentElement.insertBefore(content, element.nextSibling);
652
+ }
653
+ }
654
+ /**
655
+ * 在元素前面添加兄弟元素或HTML字符串
656
+ * @param element 目标元素
657
+ * @param content 兄弟元素或HTML字符串
658
+ * @example
659
+ * // 元素a.xx前面添加一个元素
660
+ * DOMUtils.before(document.querySelector("a.xx"),document.querySelector("b.xx"))
661
+ * DOMUtils.before("a.xx","'<b class="xx"></b>")
662
+ * */
663
+ before(element, content) {
664
+ if (typeof element === "string") {
665
+ element = DOMUtilsCore.document.querySelector(element);
666
+ }
667
+ if (element == null) {
668
+ return;
669
+ }
670
+ if (typeof content === "string") {
671
+ element.insertAdjacentHTML("beforebegin", content);
672
+ }
673
+ else {
674
+ element.parentElement.insertBefore(content, element);
675
+ }
676
+ }
677
+ /**
678
+ * 移除元素
679
+ * @param target 目标元素
680
+ * @example
681
+ * // 元素a.xx前面添加一个元素
682
+ * DOMUtils.remove(document.querySelector("a.xx"))
683
+ * DOMUtils.remove(document.querySelectorAll("a.xx"))
684
+ * DOMUtils.remove("a.xx")
685
+ * */
686
+ remove(target) {
687
+ let DOMUtilsContext = this;
688
+ if (typeof target === "string") {
689
+ target = DOMUtilsCore.document.querySelectorAll(target);
690
+ }
691
+ if (target == null) {
692
+ return;
693
+ }
694
+ if (target instanceof NodeList || target instanceof Array) {
695
+ target = target;
696
+ for (const element of target) {
697
+ DOMUtilsContext.remove(element);
698
+ }
699
+ }
700
+ else {
701
+ target.remove();
702
+ }
703
+ }
704
+ /**
705
+ * 移除元素的所有子元素
706
+ * @param element 目标元素
707
+ * @example
708
+ * // 移除元素a.xx元素的所有子元素
709
+ * DOMUtils.empty(document.querySelector("a.xx"))
710
+ * DOMUtils.empty("a.xx")
711
+ * */
712
+ empty(element) {
713
+ if (typeof element === "string") {
714
+ element = DOMUtilsCore.document.querySelector(element);
715
+ }
716
+ if (element == null) {
717
+ return;
718
+ }
719
+ element.innerHTML = "";
720
+ }
721
+ on(element, eventType, selector, callback, option) {
722
+ /**
723
+ * 获取option配置
724
+ * @param args
725
+ * @param startIndex
726
+ * @param option
727
+ */
728
+ function getOption(args, startIndex, option) {
729
+ if (typeof args[startIndex] === "boolean") {
730
+ option.capture = args[startIndex];
731
+ if (typeof args[startIndex + 1] === "boolean") {
732
+ option.once = args[startIndex + 1];
733
+ }
734
+ if (typeof args[startIndex + 2] === "boolean") {
735
+ option.passive = args[startIndex + 2];
736
+ }
737
+ }
738
+ else if (typeof args[startIndex] === "object" &&
739
+ ("capture" in args[startIndex] ||
740
+ "once" in args[startIndex] ||
741
+ "passive" in args[startIndex])) {
742
+ option.capture = args[startIndex].capture;
743
+ option.once = args[startIndex].once;
744
+ option.passive = args[startIndex].passive;
745
+ }
746
+ return option;
747
+ }
748
+ let DOMUtilsContext = this;
749
+ let args = arguments;
750
+ if (typeof element === "string") {
751
+ element = DOMUtilsCore.document.querySelectorAll(element);
752
+ }
753
+ if (element == null) {
754
+ return;
755
+ }
756
+ let elementList = [];
757
+ if (element instanceof NodeList || Array.isArray(element)) {
758
+ element = element;
759
+ elementList = [...element];
760
+ }
761
+ else {
762
+ elementList.push(element);
763
+ }
764
+ let eventTypeList = [];
765
+ if (Array.isArray(eventType)) {
766
+ eventTypeList = eventTypeList.concat(eventType);
767
+ }
768
+ else if (typeof eventType === "string") {
769
+ eventTypeList = eventTypeList.concat(eventType.split(" "));
770
+ }
771
+ let _selector_ = selector;
772
+ let _callback_ = callback;
773
+ let _option_ = {
774
+ capture: false,
775
+ once: false,
776
+ passive: false,
777
+ };
778
+ if (typeof selector === "function") {
779
+ /* 这是为没有selector的情况 */
780
+ _selector_ = void 0;
781
+ _callback_ = selector;
782
+ _option_ = getOption(args, 3, _option_);
783
+ }
784
+ else {
785
+ /* 这是存在selector的情况 */
786
+ _option_ = getOption(args, 4, _option_);
787
+ }
788
+ /**
789
+ * 如果是once,那么删除该监听和元素上的事件和监听
790
+ */
791
+ function checkOptionOnceToRemoveEventListener() {
792
+ if (_option_.once) {
793
+ DOMUtilsContext.off(element, eventType, selector, callback, option);
794
+ }
795
+ }
796
+ elementList.forEach((elementItem) => {
797
+ function ownCallBack(event) {
798
+ let target = event.target;
799
+ if (_selector_) {
800
+ /* 存在自定义子元素选择器 */
801
+ let totalParent = CommonDOMUtils.isWin(elementItem)
802
+ ? DOMUtilsCore.document.documentElement
803
+ : elementItem;
804
+ if (target.matches(_selector_)) {
805
+ /* 当前目标可以被selector所匹配到 */
806
+ _callback_.call(target, event);
807
+ checkOptionOnceToRemoveEventListener();
808
+ }
809
+ else if (target.closest(_selector_) &&
810
+ totalParent.contains(target.closest(_selector_))) {
811
+ /* 在上层与主元素之间寻找可以被selector所匹配到的 */
812
+ let closestElement = target.closest(_selector_);
813
+ /* event的target值不能直接修改 */
814
+ OriginPrototype.Object.defineProperty(event, "target", {
815
+ get() {
816
+ return closestElement;
817
+ },
818
+ });
819
+ _callback_.call(closestElement, event);
820
+ checkOptionOnceToRemoveEventListener();
821
+ }
822
+ }
823
+ else {
824
+ _callback_.call(elementItem, event);
825
+ checkOptionOnceToRemoveEventListener();
826
+ }
827
+ }
828
+ /* 遍历事件名设置元素事件 */
829
+ eventTypeList.forEach((eventName) => {
830
+ elementItem.addEventListener(eventName, ownCallBack, _option_);
831
+ if (_callback_ && _callback_.delegate) {
832
+ elementItem.setAttribute("data-delegate", _selector_);
833
+ }
834
+ /* 获取对象上的事件 */
835
+ let elementEvents = elementItem[DOMUtilsData.SymbolEvents] || {};
836
+ /* 初始化对象上的xx事件 */
837
+ elementEvents[eventName] = elementEvents[eventName] || [];
838
+ elementEvents[eventName].push({
839
+ selector: _selector_,
840
+ option: _option_,
841
+ callback: ownCallBack,
842
+ originCallBack: _callback_,
843
+ });
844
+ /* 覆盖事件 */
845
+ elementItem[DOMUtilsData.SymbolEvents] = elementEvents;
846
+ });
847
+ });
848
+ }
849
+ off(element, eventType, selector, callback, option, filter) {
850
+ /**
851
+ * 获取option配置
852
+ * @param args1
853
+ * @param startIndex
854
+ * @param option
855
+ */
856
+ function getOption(args1, startIndex, option) {
857
+ if (typeof args1[startIndex] === "boolean") {
858
+ option.capture = args1[startIndex];
859
+ }
860
+ else if (typeof args1[startIndex] === "object" &&
861
+ "capture" in args1[startIndex]) {
862
+ option.capture = args1[startIndex].capture;
863
+ }
864
+ return option;
865
+ }
866
+ let args = arguments;
867
+ if (typeof element === "string") {
868
+ element = DOMUtilsCore.document.querySelectorAll(element);
869
+ }
870
+ if (element == null) {
871
+ return;
872
+ }
873
+ let elementList = [];
874
+ if (element instanceof NodeList || Array.isArray(element)) {
875
+ element = element;
876
+ elementList = [...element];
877
+ }
878
+ else {
879
+ elementList.push(element);
880
+ }
881
+ let eventTypeList = [];
882
+ if (Array.isArray(eventType)) {
883
+ eventTypeList = eventTypeList.concat(eventType);
884
+ }
885
+ else if (typeof eventType === "string") {
886
+ eventTypeList = eventTypeList.concat(eventType.split(" "));
887
+ }
888
+ /**
889
+ * 子元素选择器
890
+ */
891
+ let _selector_ = selector;
892
+ /**
893
+ * 事件的回调函数
894
+ */
895
+ let _callback_ = callback;
896
+ /**
897
+ * 事件的配置
898
+ */
899
+ let _option_ = {
900
+ capture: false,
901
+ };
902
+ if (typeof selector === "function") {
903
+ /* 这是为没有selector的情况 */
904
+ _selector_ = void 0;
905
+ _callback_ = selector;
906
+ _option_ = getOption(args, 3, _option_);
907
+ }
908
+ else {
909
+ _option_ = getOption(args, 4, _option_);
910
+ }
911
+ elementList.forEach((elementItem) => {
912
+ /* 获取对象上的事件 */
913
+ let elementEvents = elementItem[DOMUtilsData.SymbolEvents] || {};
914
+ eventTypeList.forEach((eventName) => {
915
+ let handlers = elementEvents[eventName] || [];
916
+ if (typeof filter === "function") {
917
+ handlers = handlers.filter(filter);
918
+ }
919
+ for (let index = 0; index < handlers.length; index++) {
920
+ let handler = handlers[index];
921
+ let flag = false;
922
+ if (!_selector_ || handler.selector === _selector_) {
923
+ /* selector不为空,进行selector判断 */
924
+ flag = true;
925
+ }
926
+ if (!_callback_ ||
927
+ handler.callback === _callback_ ||
928
+ handler.originCallBack === _callback_) {
929
+ /* callback不为空,进行callback判断 */
930
+ flag = true;
931
+ }
932
+ if (flag) {
933
+ elementItem.removeEventListener(eventName, handler.callback, _option_);
934
+ handlers.splice(index--, 1);
935
+ }
936
+ }
937
+ if (handlers.length === 0) {
938
+ /* 如果没有任意的handler,那么删除该属性 */
939
+ CommonDOMUtils.delete(elementEvents, eventType);
940
+ }
941
+ });
942
+ elementItem[DOMUtilsData.SymbolEvents] = elementEvents;
943
+ });
944
+ }
945
+ /**
946
+ * 取消绑定所有的事件
947
+ * @param element 需要取消绑定的元素|元素数组
948
+ * @param eventType (可选)需要取消监听的事件
949
+ */
950
+ offAll(element, eventType) {
951
+ if (typeof element === "string") {
952
+ element = DOMUtilsCore.document.querySelectorAll(element);
953
+ }
954
+ if (element == null) {
955
+ return;
956
+ }
957
+ let elementList = [];
958
+ if (element instanceof NodeList || Array.isArray(element)) {
959
+ element = element;
960
+ elementList = [...element];
961
+ }
962
+ else {
963
+ elementList.push(element);
964
+ }
965
+ let eventTypeList = [];
966
+ if (Array.isArray(eventType)) {
967
+ eventTypeList = eventTypeList.concat(eventType);
968
+ }
969
+ else if (typeof eventType === "string") {
970
+ eventTypeList = eventTypeList.concat(eventType.split(" "));
971
+ }
972
+ elementList.forEach((elementItem) => {
973
+ Object.getOwnPropertySymbols(elementItem).forEach((symbolEvents) => {
974
+ if (!symbolEvents.toString().startsWith("Symbol(events_")) {
975
+ return;
976
+ }
977
+ let elementEvents = elementItem[symbolEvents] || {};
978
+ let iterEventNameList = eventTypeList.length
979
+ ? eventTypeList
980
+ : Object.keys(elementEvents);
981
+ iterEventNameList.forEach((eventName) => {
982
+ let handlers = elementEvents[eventName];
983
+ if (!handlers) {
984
+ return;
985
+ }
986
+ for (const handler of handlers) {
987
+ elementItem.removeEventListener(eventName, handler.callback, {
988
+ capture: handler["option"]["capture"],
989
+ });
990
+ }
991
+ CommonDOMUtils.delete(elementItem[symbolEvents], eventName);
992
+ });
993
+ });
994
+ });
995
+ }
996
+ /**
997
+ * 主动触发事件
998
+ * @param element 需要触发的元素|元素数组|window
999
+ * @param eventType 需要触发的事件
1000
+ * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
1001
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
1002
+ * @example
1003
+ * // 触发元素a.xx的click事件
1004
+ * DOMUtils.trigger(document.querySelector("a.xx"),"click")
1005
+ * DOMUtils.trigger("a.xx","click")
1006
+ * // 触发元素a.xx的click、tap、hover事件
1007
+ * DOMUtils.trigger(document.querySelector("a.xx"),"click tap hover")
1008
+ * DOMUtils.trigger("a.xx",["click","tap","hover"])
1009
+ */
1010
+ trigger(element, eventType, details, useDispatchToTriggerEvent = true) {
1011
+ if (typeof element === "string") {
1012
+ element = DOMUtilsCore.document.querySelector(element);
1013
+ }
1014
+ if (element == null) {
1015
+ return;
1016
+ }
1017
+ let elementList = [];
1018
+ if (element instanceof NodeList || Array.isArray(element)) {
1019
+ element = element;
1020
+ elementList = [...element];
1021
+ }
1022
+ else {
1023
+ elementList = [element];
1024
+ }
1025
+ let eventTypeList = [];
1026
+ if (Array.isArray(eventType)) {
1027
+ eventTypeList = eventType;
1028
+ }
1029
+ else if (typeof eventType === "string") {
1030
+ eventTypeList = eventType.split(" ");
1031
+ }
1032
+ elementList.forEach((elementItem) => {
1033
+ /* 获取对象上的事件 */
1034
+ let events = elementItem[DOMUtilsData.SymbolEvents] || {};
1035
+ eventTypeList.forEach((_eventType_) => {
1036
+ let event = null;
1037
+ if (details && details instanceof Event) {
1038
+ event = details;
1039
+ }
1040
+ else {
1041
+ event = new Event(_eventType_);
1042
+ if (details) {
1043
+ Object.keys(details).forEach((keyName) => {
1044
+ event[keyName] = details[keyName];
1045
+ });
1046
+ }
1047
+ }
1048
+ if (useDispatchToTriggerEvent == false && _eventType_ in events) {
1049
+ events[_eventType_].forEach((eventsItem) => {
1050
+ eventsItem.callback(event);
1051
+ });
1052
+ }
1053
+ else {
1054
+ elementItem.dispatchEvent(event);
1055
+ }
1056
+ });
1057
+ });
1058
+ }
1059
+ /**
1060
+ * 获取元素相对于文档的偏移坐标(加上文档的滚动条)
1061
+ * @param element 目标元素
1062
+ * @example
1063
+ * // 获取元素a.xx的对于文档的偏移坐标
1064
+ * DOMUtils.offset(document.querySelector("a.xx"))
1065
+ * DOMUtils.offset("a.xx")
1066
+ * > 0
1067
+ */
1068
+ offset(element) {
1069
+ if (typeof element === "string") {
1070
+ element = DOMUtilsCore.document.querySelector(element);
1071
+ }
1072
+ if (element == null) {
1073
+ return;
1074
+ }
1075
+ let rect = element.getBoundingClientRect();
1076
+ return {
1077
+ /** y轴偏移 */
1078
+ top: rect.top + DOMUtilsCore.globalThis.scrollY,
1079
+ /** x轴偏移 */
1080
+ left: rect.left + DOMUtilsCore.globalThis.scrollX,
1081
+ };
1082
+ }
1083
+ width(element, isShow = false) {
1084
+ let DOMUtilsContext = this;
1085
+ if (typeof element === "string") {
1086
+ element = DOMUtilsCore.document.querySelector(element);
1087
+ }
1088
+ if (element == null) {
1089
+ return;
1090
+ }
1091
+ if (CommonDOMUtils.isWin(element)) {
1092
+ return DOMUtilsCore.window.document.documentElement.clientWidth;
1093
+ }
1094
+ if (element.nodeType === 9) {
1095
+ /* Document文档节点 */
1096
+ element = element;
1097
+ return Math.max(element.body.scrollWidth, element.documentElement.scrollWidth, element.body.offsetWidth, element.documentElement.offsetWidth, element.documentElement.clientWidth);
1098
+ }
1099
+ if (isShow || (!isShow && CommonDOMUtils.isShow(element))) {
1100
+ /* 已显示 */
1101
+ /* 不从style中获取对应的宽度,因为可能使用了class定义了width !important */
1102
+ element = element;
1103
+ /* 如果element.style.width为空 则从css里面获取是否定义了width信息如果定义了 则读取css里面定义的宽度width */
1104
+ if (parseFloat(CommonDOMUtils.getStyleValue(element, "width").toString()) >
1105
+ 0) {
1106
+ return parseFloat(CommonDOMUtils.getStyleValue(element, "width").toString());
1107
+ }
1108
+ /* 如果从css里获取到的值不是大于0 可能是auto 则通过offsetWidth来进行计算 */
1109
+ if (element.offsetWidth > 0) {
1110
+ let borderLeftWidth = CommonDOMUtils.getStyleValue(element, "borderLeftWidth");
1111
+ let borderRightWidth = CommonDOMUtils.getStyleValue(element, "borderRightWidth");
1112
+ let paddingLeft = CommonDOMUtils.getStyleValue(element, "paddingLeft");
1113
+ let paddingRight = CommonDOMUtils.getStyleValue(element, "paddingRight");
1114
+ let backHeight = parseFloat(element.offsetWidth.toString()) -
1115
+ parseFloat(borderLeftWidth.toString()) -
1116
+ parseFloat(borderRightWidth.toString()) -
1117
+ parseFloat(paddingLeft.toString()) -
1118
+ parseFloat(paddingRight.toString());
1119
+ return parseFloat(backHeight.toString());
1120
+ }
1121
+ return 0;
1122
+ }
1123
+ else {
1124
+ /* 未显示 */
1125
+ element = element;
1126
+ let { recovery } = CommonDOMUtils.showElement(element);
1127
+ let width = DOMUtilsContext.width(element, true);
1128
+ recovery();
1129
+ return width;
1130
+ }
1131
+ }
1132
+ height(element, isShow = false) {
1133
+ let DOMUtilsContext = this;
1134
+ if (CommonDOMUtils.isWin(element)) {
1135
+ return DOMUtilsCore.window.document.documentElement.clientHeight;
1136
+ }
1137
+ if (typeof element === "string") {
1138
+ element = DOMUtilsCore.document.querySelector(element);
1139
+ }
1140
+ if (element == null) {
1141
+ // @ts-ignore
1142
+ return;
1143
+ }
1144
+ if (element.nodeType === 9) {
1145
+ element = element;
1146
+ /* Document文档节点 */
1147
+ return Math.max(element.body.scrollHeight, element.documentElement.scrollHeight, element.body.offsetHeight, element.documentElement.offsetHeight, element.documentElement.clientHeight);
1148
+ }
1149
+ if (isShow || (!isShow && CommonDOMUtils.isShow(element))) {
1150
+ element = element;
1151
+ /* 已显示 */
1152
+ /* 从style中获取对应的高度,因为可能使用了class定义了width !important */
1153
+ /* 如果element.style.height为空 则从css里面获取是否定义了height信息如果定义了 则读取css里面定义的高度height */
1154
+ if (parseFloat(CommonDOMUtils.getStyleValue(element, "height").toString()) >
1155
+ 0) {
1156
+ return parseFloat(CommonDOMUtils.getStyleValue(element, "height").toString());
1157
+ }
1158
+ /* 如果从css里获取到的值不是大于0 可能是auto 则通过offsetHeight来进行计算 */
1159
+ if (element.offsetHeight > 0) {
1160
+ let borderTopWidth = CommonDOMUtils.getStyleValue(element, "borderTopWidth");
1161
+ let borderBottomWidth = CommonDOMUtils.getStyleValue(element, "borderBottomWidth");
1162
+ let paddingTop = CommonDOMUtils.getStyleValue(element, "paddingTop");
1163
+ let paddingBottom = CommonDOMUtils.getStyleValue(element, "paddingBottom");
1164
+ let backHeight = parseFloat(element.offsetHeight.toString()) -
1165
+ parseFloat(borderTopWidth.toString()) -
1166
+ parseFloat(borderBottomWidth.toString()) -
1167
+ parseFloat(paddingTop.toString()) -
1168
+ parseFloat(paddingBottom.toString());
1169
+ return parseFloat(backHeight.toString());
1170
+ }
1171
+ return 0;
1172
+ }
1173
+ else {
1174
+ /* 未显示 */
1175
+ element = element;
1176
+ let { recovery } = CommonDOMUtils.showElement(element);
1177
+ let height = DOMUtilsContext.height(element, true);
1178
+ recovery();
1179
+ return height;
1180
+ }
1181
+ }
1182
+ outerWidth(element, isShow = false) {
1183
+ let DOMUtilsContext = this;
1184
+ if (CommonDOMUtils.isWin(element)) {
1185
+ return DOMUtilsCore.window.innerWidth;
1186
+ }
1187
+ if (typeof element === "string") {
1188
+ element = DOMUtilsCore.document.querySelector(element);
1189
+ }
1190
+ if (element == null) {
1191
+ // @ts-ignore
1192
+ return;
1193
+ }
1194
+ element = element;
1195
+ if (isShow || (!isShow && CommonDOMUtils.isShow(element))) {
1196
+ let style = getComputedStyle(element, null);
1197
+ let marginLeft = CommonDOMUtils.getStyleValue(style, "marginLeft");
1198
+ let marginRight = CommonDOMUtils.getStyleValue(style, "marginRight");
1199
+ return element.offsetWidth + marginLeft + marginRight;
1200
+ }
1201
+ else {
1202
+ let { recovery } = CommonDOMUtils.showElement(element);
1203
+ let outerWidth = DOMUtilsContext.outerWidth(element, true);
1204
+ recovery();
1205
+ return outerWidth;
1206
+ }
1207
+ }
1208
+ outerHeight(element, isShow = false) {
1209
+ let DOMUtilsContext = this;
1210
+ if (CommonDOMUtils.isWin(element)) {
1211
+ return DOMUtilsCore.window.innerHeight;
1212
+ }
1213
+ if (typeof element === "string") {
1214
+ element = DOMUtilsCore.document.querySelector(element);
1215
+ }
1216
+ if (element == null) {
1217
+ // @ts-ignore
1218
+ return;
1219
+ }
1220
+ element = element;
1221
+ if (isShow || (!isShow && CommonDOMUtils.isShow(element))) {
1222
+ let style = getComputedStyle(element, null);
1223
+ let marginTop = CommonDOMUtils.getStyleValue(style, "marginTop");
1224
+ let marginBottom = CommonDOMUtils.getStyleValue(style, "marginBottom");
1225
+ return element.offsetHeight + marginTop + marginBottom;
1226
+ }
1227
+ else {
1228
+ let { recovery } = CommonDOMUtils.showElement(element);
1229
+ let outerHeight = DOMUtilsContext.outerHeight(element, true);
1230
+ recovery();
1231
+ return outerHeight;
1232
+ }
1233
+ }
1234
+ /**
1235
+ * 等待文档加载完成后执行指定的函数
1236
+ * @param callback 需要执行的函数
1237
+ * @example
1238
+ * DOMUtils.ready(function(){
1239
+ * console.log("文档加载完毕")
1240
+ * })
1241
+ */
1242
+ ready(callback) {
1243
+ let DOMUtilsContext = this;
1244
+ function completed() {
1245
+ DOMUtilsContext.off(document, "DOMContentLoaded", completed);
1246
+ DOMUtilsContext.off(globalThis, "load", completed);
1247
+ callback();
1248
+ }
1249
+ if (document.readyState === "complete" ||
1250
+ (document.readyState !== "loading" &&
1251
+ !document.documentElement.doScroll)) {
1252
+ setTimeout(callback);
1253
+ }
1254
+ else {
1255
+ /* 监听DOMContentLoaded事件 */
1256
+ DOMUtilsContext.on(document, "DOMContentLoaded", completed);
1257
+ /* 监听load事件 */
1258
+ DOMUtilsContext.on(globalThis, "load", completed);
1259
+ }
1260
+ }
1261
+ /**
1262
+ * 在一定时间内改变元素的样式属性,实现动画效果
1263
+ * @param element 需要进行动画的元素
1264
+ * @param styles 动画结束时元素的样式属性
1265
+ * @param duration 动画持续时间,单位为毫秒
1266
+ * @param callback 动画结束后执行的函数
1267
+ * @example
1268
+ * // 监听元素a.xx的从显示变为隐藏
1269
+ * DOMUtils.animate(document.querySelector("a.xx"),{ top:100},1000,function(){
1270
+ * console.log("已往上位移100px")
1271
+ * })
1272
+ */
1273
+ animate(element, styles, duration = 1000, callback = null) {
1274
+ if (typeof element === "string") {
1275
+ element = DOMUtilsCore.document.querySelector(element);
1276
+ }
1277
+ if (element == null) {
1278
+ return;
1279
+ }
1280
+ if (typeof duration !== "number" || duration <= 0) {
1281
+ throw new TypeError("duration must be a positive number");
1282
+ }
1283
+ if (typeof callback !== "function" && callback !== void 0) {
1284
+ throw new TypeError("callback must be a function or null");
1285
+ }
1286
+ if (typeof styles !== "object" || styles === void 0) {
1287
+ throw new TypeError("styles must be an object");
1288
+ }
1289
+ if (Object.keys(styles).length === 0) {
1290
+ throw new Error("styles must contain at least one property");
1291
+ }
1292
+ let start = performance.now();
1293
+ let from = {};
1294
+ let to = {};
1295
+ for (let prop in styles) {
1296
+ from[prop] = element.style[prop] || getComputedStyle(element)[prop];
1297
+ to[prop] = styles[prop];
1298
+ }
1299
+ let timer = setInterval(function () {
1300
+ let timePassed = performance.now() - start;
1301
+ let progress = timePassed / duration;
1302
+ if (progress > 1) {
1303
+ progress = 1;
1304
+ }
1305
+ for (let prop in styles) {
1306
+ element.style[prop] =
1307
+ from[prop] + (to[prop] - from[prop]) * progress + "px";
1308
+ }
1309
+ if (progress === 1) {
1310
+ clearInterval(timer);
1311
+ if (callback) {
1312
+ callback();
1313
+ }
1314
+ }
1315
+ }, 10);
1316
+ }
1317
+ /**
1318
+ * 将一个元素包裹在指定的HTML元素中
1319
+ * @param element 要包裹的元素
1320
+ * @param wrapperHTML 要包裹的HTML元素的字符串表示形式
1321
+ * @example
1322
+ * // 将a.xx元素外面包裹一层div
1323
+ * DOMUtils.wrap(document.querySelector("a.xx"),"<div></div>")
1324
+ */
1325
+ wrap(element, wrapperHTML) {
1326
+ if (typeof element === "string") {
1327
+ element = DOMUtilsCore.document.querySelector(element);
1328
+ }
1329
+ if (element == null) {
1330
+ return;
1331
+ }
1332
+ element = element;
1333
+ // 创建一个新的div元素,并将wrapperHTML作为其innerHTML
1334
+ let wrapper = DOMUtilsCore.document.createElement("div");
1335
+ wrapper.innerHTML = wrapperHTML;
1336
+ let wrapperFirstChild = wrapper.firstChild;
1337
+ // 将要包裹的元素插入目标元素前面
1338
+ element.parentElement.insertBefore(wrapperFirstChild, element);
1339
+ // 将要包裹的元素移动到wrapper中
1340
+ wrapperFirstChild.appendChild(element);
1341
+ }
1342
+ prev(element) {
1343
+ if (typeof element === "string") {
1344
+ element = DOMUtilsCore.document.querySelector(element);
1345
+ }
1346
+ if (element == null) {
1347
+ return;
1348
+ }
1349
+ return element.previousElementSibling;
1350
+ }
1351
+ next(element) {
1352
+ if (typeof element === "string") {
1353
+ element = DOMUtilsCore.document.querySelector(element);
1354
+ }
1355
+ if (element == null) {
1356
+ return;
1357
+ }
1358
+ return element.nextElementSibling;
1359
+ }
1360
+ /**
1361
+ * 取消挂载在window下的DOMUtils并返回DOMUtils
1362
+ * @example
1363
+ * let DOMUtils = window.DOMUtils.noConflict()
1364
+ */
1365
+ noConflict() {
1366
+ if (DOMUtilsCore.window.DOMUtils) {
1367
+ CommonDOMUtils.delete(window, "DOMUtils");
1368
+ }
1369
+ DOMUtilsCore.window.DOMUtils = this;
1370
+ return this;
1371
+ }
1372
+ siblings(element) {
1373
+ if (typeof element === "string") {
1374
+ element = DOMUtilsCore.document.querySelector(element);
1375
+ }
1376
+ if (element == null) {
1377
+ return;
1378
+ }
1379
+ return Array.from(element.parentElement
1380
+ .children).filter((child) => child !== element);
1381
+ }
1382
+ /**
1383
+ * 获取当前元素的父元素
1384
+ * @param element 当前元素
1385
+ * @returns 父元素
1386
+ * @example
1387
+ * // 获取a.xx元素的父元素
1388
+ * DOMUtils.parent(document.querySelector("a.xx"))
1389
+ * DOMUtils.parent("a.xx")
1390
+ * > <div ...>....</div>
1391
+ */
1392
+ parent(element) {
1393
+ let DOMUtilsContext = this;
1394
+ if (typeof element === "string") {
1395
+ element = DOMUtilsCore.document.querySelector(element);
1396
+ }
1397
+ if (element == null) {
1398
+ return;
1399
+ }
1400
+ if (element instanceof NodeList || element instanceof Array) {
1401
+ element = element;
1402
+ let resultArray = [];
1403
+ element.forEach((eleItem) => {
1404
+ resultArray.push(DOMUtilsContext.parent(eleItem));
1405
+ });
1406
+ return resultArray;
1407
+ }
1408
+ else {
1409
+ return element.parentElement;
1410
+ }
1411
+ }
1412
+ parseHTML(html, useParser = false, isComplete = false) {
1413
+ function parseHTMLByDOMParser() {
1414
+ let parser = new DOMParser();
1415
+ if (isComplete) {
1416
+ return parser.parseFromString(html, "text/html");
1417
+ }
1418
+ else {
1419
+ return parser.parseFromString(html, "text/html").body.firstChild;
1420
+ }
1421
+ }
1422
+ function parseHTMLByCreateDom() {
1423
+ let tempDIV = DOMUtilsCore.document.createElement("div");
1424
+ tempDIV.innerHTML = html;
1425
+ if (isComplete) {
1426
+ return tempDIV;
1427
+ }
1428
+ else {
1429
+ return tempDIV.firstChild;
1430
+ }
1431
+ }
1432
+ if (useParser) {
1433
+ return parseHTMLByDOMParser();
1434
+ }
1435
+ else {
1436
+ return parseHTMLByCreateDom();
1437
+ }
1438
+ }
1439
+ /**
1440
+ * 当鼠标移入或移出元素时触发事件
1441
+ * @param element 当前元素
1442
+ * @param handler 事件处理函数
1443
+ * @param option 配置
1444
+ * @example
1445
+ * // 监听a.xx元素的移入或移出
1446
+ * DOMUtils.hover(document.querySelector("a.xx"),()=>{
1447
+ * console.log("移入/移除");
1448
+ * })
1449
+ * DOMUtils.hover("a.xx",()=>{
1450
+ * console.log("移入/移除");
1451
+ * })
1452
+ */
1453
+ hover(element, handler, option) {
1454
+ let DOMUtilsContext = this;
1455
+ if (typeof element === "string") {
1456
+ element = DOMUtilsCore.document.querySelector(element);
1457
+ }
1458
+ if (element == null) {
1459
+ return;
1460
+ }
1461
+ DOMUtilsContext.on(element, "mouseenter", null, handler, option);
1462
+ DOMUtilsContext.on(element, "mouseleave", null, handler, option);
1463
+ }
1464
+ /**
1465
+ * 显示元素
1466
+ * @param target 当前元素
1467
+ * @example
1468
+ * // 显示a.xx元素
1469
+ * DOMUtils.show(document.querySelector("a.xx"))
1470
+ * DOMUtils.show(document.querySelectorAll("a.xx"))
1471
+ * DOMUtils.show("a.xx")
1472
+ */
1473
+ show(target) {
1474
+ let DOMUtilsContext = this;
1475
+ if (target == null) {
1476
+ return;
1477
+ }
1478
+ if (typeof target === "string") {
1479
+ target = DOMUtilsCore.document.querySelectorAll(target);
1480
+ }
1481
+ if (target instanceof NodeList || target instanceof Array) {
1482
+ target = target;
1483
+ for (const element of target) {
1484
+ DOMUtilsContext.show(element);
1485
+ }
1486
+ }
1487
+ else {
1488
+ target = target;
1489
+ target.style.display = "";
1490
+ if (!CommonDOMUtils.isShow(target)) {
1491
+ /* 仍然是不显示,尝试使用强覆盖 */
1492
+ target.style.setProperty("display", "unset", "important");
1493
+ }
1494
+ }
1495
+ }
1496
+ /**
1497
+ * 隐藏元素
1498
+ * @param target 当前元素
1499
+ * @example
1500
+ * // 隐藏a.xx元素
1501
+ * DOMUtils.hide(document.querySelector("a.xx"))
1502
+ * DOMUtils.hide(document.querySelectorAll("a.xx"))
1503
+ * DOMUtils.hide("a.xx")
1504
+ */
1505
+ hide(target) {
1506
+ let DOMUtilsContext = this;
1507
+ if (target == null) {
1508
+ return;
1509
+ }
1510
+ if (typeof target === "string") {
1511
+ target = DOMUtilsCore.document.querySelectorAll(target);
1512
+ }
1513
+ if (target instanceof NodeList || target instanceof Array) {
1514
+ target = target;
1515
+ for (const element of target) {
1516
+ DOMUtilsContext.hide(element);
1517
+ }
1518
+ }
1519
+ else {
1520
+ target = target;
1521
+ target.style.display = "none";
1522
+ if (CommonDOMUtils.isShow(target)) {
1523
+ /* 仍然是显示,尝试使用强覆盖 */
1524
+ target.style.setProperty("display", "none", "important");
1525
+ }
1526
+ }
1527
+ }
1528
+ /**
1529
+ * 当按键松开时触发事件
1530
+ * keydown - > keypress - > keyup
1531
+ * @param target 当前元素
1532
+ * @param handler 事件处理函数
1533
+ * @param option 配置
1534
+ * @example
1535
+ * // 监听a.xx元素的按键松开
1536
+ * DOMUtils.keyup(document.querySelector("a.xx"),()=>{
1537
+ * console.log("按键松开");
1538
+ * })
1539
+ * DOMUtils.keyup("a.xx",()=>{
1540
+ * console.log("按键松开");
1541
+ * })
1542
+ */
1543
+ keyup(target, handler, option) {
1544
+ let DOMUtilsContext = this;
1545
+ if (target == null) {
1546
+ return;
1547
+ }
1548
+ if (typeof target === "string") {
1549
+ target = DOMUtilsCore.document.querySelector(target);
1550
+ }
1551
+ DOMUtilsContext.on(target, "keyup", null, handler, option);
1552
+ }
1553
+ /**
1554
+ * 当按键按下时触发事件
1555
+ * keydown - > keypress - > keyup
1556
+ * @param target 目标
1557
+ * @param handler 事件处理函数
1558
+ * @param option 配置
1559
+ * @example
1560
+ * // 监听a.xx元素的按键按下
1561
+ * DOMUtils.keydown(document.querySelector("a.xx"),()=>{
1562
+ * console.log("按键按下");
1563
+ * })
1564
+ * DOMUtils.keydown("a.xx",()=>{
1565
+ * console.log("按键按下");
1566
+ * })
1567
+ */
1568
+ keydown(target, handler, option) {
1569
+ let DOMUtilsContext = this;
1570
+ if (target == null) {
1571
+ return;
1572
+ }
1573
+ if (typeof target === "string") {
1574
+ target = DOMUtilsCore.document.querySelector(target);
1575
+ }
1576
+ DOMUtilsContext.on(target, "keydown", null, handler, option);
1577
+ }
1578
+ /**
1579
+ * 当按键按下时触发事件
1580
+ * keydown - > keypress - > keyup
1581
+ * @param target 目标
1582
+ * @param handler 事件处理函数
1583
+ * @param option 配置
1584
+ * @example
1585
+ * // 监听a.xx元素的按键按下
1586
+ * DOMUtils.keypress(document.querySelector("a.xx"),()=>{
1587
+ * console.log("按键按下");
1588
+ * })
1589
+ * DOMUtils.keypress("a.xx",()=>{
1590
+ * console.log("按键按下");
1591
+ * })
1592
+ */
1593
+ keypress(target, handler, option) {
1594
+ let DOMUtilsContext = this;
1595
+ if (target == null) {
1596
+ return;
1597
+ }
1598
+ if (typeof target === "string") {
1599
+ target = DOMUtilsCore.document.querySelector(target);
1600
+ }
1601
+ DOMUtilsContext.on(target, "keypress", null, handler, option);
1602
+ }
1603
+ /**
1604
+ * 淡入元素
1605
+ * @param element 当前元素
1606
+ * @param duration 动画持续时间(毫秒),默认400毫秒
1607
+ * @param callback 动画结束的回调
1608
+ * @example
1609
+ * // 元素a.xx淡入
1610
+ * DOMUtils.fadeIn(document.querySelector("a.xx"),2500,()=>{
1611
+ * console.log("淡入完毕");
1612
+ * })
1613
+ * DOMUtils.fadeIn("a.xx",undefined,()=>{
1614
+ * console.log("淡入完毕");
1615
+ * })
1616
+ */
1617
+ fadeIn(element, duration = 400, callback) {
1618
+ if (element == null) {
1619
+ return;
1620
+ }
1621
+ if (typeof element === "string") {
1622
+ element = DOMUtilsCore.document.querySelector(element);
1623
+ }
1624
+ element = element;
1625
+ element.style.opacity = "0";
1626
+ element.style.display = "";
1627
+ let start = null;
1628
+ let timer = null;
1629
+ function step(timestamp) {
1630
+ if (!start)
1631
+ start = timestamp;
1632
+ let progress = timestamp - start;
1633
+ element = element;
1634
+ element.style.opacity = Math.min(progress / duration, 1).toString();
1635
+ if (progress < duration) {
1636
+ DOMUtilsCore.window.requestAnimationFrame(step);
1637
+ }
1638
+ else {
1639
+ if (callback && typeof callback === "function") {
1640
+ callback();
1641
+ }
1642
+ DOMUtilsCore.window.cancelAnimationFrame(timer);
1643
+ }
1644
+ }
1645
+ timer = DOMUtilsCore.window.requestAnimationFrame(step);
1646
+ }
1647
+ /**
1648
+ * 淡出元素
1649
+ * @param element 当前元素
1650
+ * @param duration 动画持续时间(毫秒),默认400毫秒
1651
+ * @param callback 动画结束的回调
1652
+ * @example
1653
+ * // 元素a.xx淡出
1654
+ * DOMUtils.fadeOut(document.querySelector("a.xx"),2500,()=>{
1655
+ * console.log("淡出完毕");
1656
+ * })
1657
+ * DOMUtils.fadeOut("a.xx",undefined,()=>{
1658
+ * console.log("淡出完毕");
1659
+ * })
1660
+ */
1661
+ fadeOut(element, duration = 400, callback) {
1662
+ if (element == null) {
1663
+ return;
1664
+ }
1665
+ if (typeof element === "string") {
1666
+ element = DOMUtilsCore.document.querySelector(element);
1667
+ }
1668
+ element = element;
1669
+ element.style.opacity = "1";
1670
+ let start = null;
1671
+ let timer = null;
1672
+ function step(timestamp) {
1673
+ if (!start)
1674
+ start = timestamp;
1675
+ let progress = timestamp - start;
1676
+ element = element;
1677
+ element.style.opacity = Math.max(1 - progress / duration, 0).toString();
1678
+ if (progress < duration) {
1679
+ DOMUtilsCore.window.requestAnimationFrame(step);
1680
+ }
1681
+ else {
1682
+ element.style.display = "none";
1683
+ if (typeof callback === "function") {
1684
+ callback();
1685
+ }
1686
+ DOMUtilsCore.window.cancelAnimationFrame(timer);
1687
+ }
1688
+ }
1689
+ timer = DOMUtilsCore.window.requestAnimationFrame(step);
1690
+ }
1691
+ /**
1692
+ * 切换元素的显示和隐藏状态
1693
+ * @param element 当前元素
1694
+ * @example
1695
+ * // 如果元素a.xx当前是隐藏,则显示,如果是显示,则隐藏
1696
+ * DOMUtils.toggle(document.querySelector("a.xx"))
1697
+ * DOMUtils.toggle("a.xx")
1698
+ */
1699
+ toggle(element) {
1700
+ let DOMUtilsContext = this;
1701
+ if (typeof element === "string") {
1702
+ element = DOMUtilsCore.document.querySelector(element);
1703
+ }
1704
+ if (element == null) {
1705
+ return;
1706
+ }
1707
+ if (getComputedStyle(element).getPropertyValue("display") === "none") {
1708
+ DOMUtilsContext.show(element);
1709
+ }
1710
+ else {
1711
+ DOMUtilsContext.hide(element);
1712
+ }
1713
+ }
1714
+ /**
1715
+ * 创建一个新的DOMUtils实例
1716
+ * @param option
1717
+ * @returns
1718
+ */
1719
+ createDOMUtils(option) {
1720
+ return new DOMUtils(option);
1721
+ }
1722
+ }
1723
+ let domUtils = exports("default", new DOMUtils());
1724
+
1725
+ })
1726
+ };
1727
+ }));
1728
+ //# sourceMappingURL=index.system.js.map