@whitesev/domutils 1.6.7 → 1.7.0

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.
Files changed (55) hide show
  1. package/dist/index.amd.js +1955 -1067
  2. package/dist/index.amd.js.map +1 -1
  3. package/dist/index.amd.min.js +2 -0
  4. package/dist/index.amd.min.js.map +1 -0
  5. package/dist/index.cjs.js +1955 -1067
  6. package/dist/index.cjs.js.map +1 -1
  7. package/dist/index.cjs.min.js +2 -0
  8. package/dist/index.cjs.min.js.map +1 -0
  9. package/dist/index.esm.js +1955 -1067
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/index.esm.min.js +2 -0
  12. package/dist/index.esm.min.js.map +1 -0
  13. package/dist/index.iife.js +1955 -1067
  14. package/dist/index.iife.js.map +1 -1
  15. package/dist/index.iife.min.js +2 -0
  16. package/dist/index.iife.min.js.map +1 -0
  17. package/dist/index.system.js +1955 -1067
  18. package/dist/index.system.js.map +1 -1
  19. package/dist/index.system.min.js +2 -0
  20. package/dist/index.system.min.js.map +1 -0
  21. package/dist/index.umd.js +1955 -1067
  22. package/dist/index.umd.js.map +1 -1
  23. package/dist/index.umd.min.js +2 -0
  24. package/dist/index.umd.min.js.map +1 -0
  25. package/dist/types/index.d.ts +1 -1
  26. package/dist/types/src/{DOMUtilsCommonUtils.d.ts → CommonUtils.d.ts} +21 -9
  27. package/dist/types/src/ElementAnimate.d.ts +89 -0
  28. package/dist/types/src/{DOMUtilsEvent.d.ts → ElementEvent.d.ts} +19 -84
  29. package/dist/types/src/ElementHandler.d.ts +17 -0
  30. package/dist/types/src/ElementSelector.d.ts +96 -0
  31. package/dist/types/src/ElementWait.d.ts +278 -0
  32. package/dist/types/src/GlobalData.d.ts +4 -0
  33. package/dist/types/src/{DOMUtilsOriginPrototype.d.ts → OriginPrototype.d.ts} +1 -2
  34. package/dist/types/src/Utils.d.ts +68 -0
  35. package/dist/types/src/{DOMUtils.d.ts → index.d.ts} +157 -177
  36. package/dist/types/src/types/env.d.ts +9 -0
  37. package/dist/types/src/types/global.d.ts +0 -2
  38. package/dist/types/src/types/gm.d.ts +0 -4
  39. package/index.ts +1 -1
  40. package/package.json +6 -2
  41. package/src/{DOMUtilsCommonUtils.ts → CommonUtils.ts} +27 -13
  42. package/src/ElementAnimate.ts +290 -0
  43. package/src/{DOMUtilsEvent.ts → ElementEvent.ts} +188 -370
  44. package/src/ElementHandler.ts +43 -0
  45. package/src/ElementSelector.ts +260 -0
  46. package/src/ElementWait.ts +699 -0
  47. package/src/GlobalData.ts +5 -0
  48. package/src/{DOMUtilsOriginPrototype.ts → OriginPrototype.ts} +1 -3
  49. package/src/Utils.ts +386 -0
  50. package/src/{DOMUtils.ts → index.ts} +679 -758
  51. package/src/types/env.d.ts +9 -0
  52. package/src/types/global.d.ts +0 -2
  53. package/src/types/gm.d.ts +0 -4
  54. package/dist/types/src/DOMUtilsData.d.ts +0 -5
  55. package/src/DOMUtilsData.ts +0 -7
@@ -1,6 +1,7 @@
1
- import { DOMUtilsCommonUtils } from "./DOMUtilsCommonUtils";
2
- import { DOMUtilsData } from "./DOMUtilsData";
3
- import { OriginPrototype } from "./DOMUtilsOriginPrototype";
1
+ import { CommonUtils } from "./CommonUtils";
2
+ import { GlobalData } from "./GlobalData";
3
+ import { ElementAnimate } from "./ElementAnimate";
4
+ import { OriginPrototype } from "./OriginPrototype";
4
5
  import type {
5
6
  DOMUtils_Event,
6
7
  DOMUtils_EventType,
@@ -12,11 +13,20 @@ import type { DOMUtilsTargetElementType } from "./types/global";
12
13
  import type { WindowApiOption } from "./types/WindowApi";
13
14
  import { WindowApi } from "./WindowApi";
14
15
 
15
- export class DOMUtilsEvent {
16
+ class ElementEvent extends ElementAnimate {
16
17
  windowApi: typeof WindowApi.prototype;
17
18
  constructor(windowApiOption?: WindowApiOption) {
19
+ super(windowApiOption);
18
20
  this.windowApi = new WindowApi(windowApiOption);
19
21
  }
22
+ /** 获取 animationend 在各个浏览器的兼容名 */
23
+ getAnimationEndNameList() {
24
+ return CommonUtils.getAnimationEndNameList();
25
+ }
26
+ /** 获取 transitionend 在各个浏览器的兼容名 */
27
+ getTransitionEndNameList() {
28
+ return CommonUtils.getTransitionEndNameList();
29
+ }
20
30
  /**
21
31
  * 绑定事件
22
32
  * @param element 需要绑定的元素|元素数组|window
@@ -173,11 +183,11 @@ export class DOMUtilsEvent {
173
183
  return option;
174
184
  }
175
185
 
176
- const DOMUtilsContext = this;
186
+ const that = this;
177
187
  // eslint-disable-next-line prefer-rest-params
178
188
  const args = arguments;
179
189
  if (typeof element === "string") {
180
- element = DOMUtilsContext.selectorAll(element);
190
+ element = that.selectorAll(element);
181
191
  }
182
192
  if (element == null) {
183
193
  return;
@@ -230,7 +240,7 @@ export class DOMUtilsEvent {
230
240
  */
231
241
  function checkOptionOnceToRemoveEventListener() {
232
242
  if (listenerOption.once) {
233
- DOMUtilsContext.off(element, eventType as any, selector as any, callback as any, option);
243
+ that.off(element, eventType as any, selector as any, callback as any, option);
234
244
  }
235
245
  }
236
246
  elementList.forEach((elementItem) => {
@@ -246,19 +256,19 @@ export class DOMUtilsEvent {
246
256
  ? (event.composedPath()[0] as HTMLElement)
247
257
  : (event.target as HTMLElement);
248
258
  let totalParent = elementItem;
249
- if (DOMUtilsCommonUtils.isWin(totalParent)) {
250
- if (totalParent === (DOMUtilsContext.windowApi.document as any as HTMLElement)) {
251
- totalParent = DOMUtilsContext.windowApi.document.documentElement;
259
+ if (CommonUtils.isWin(totalParent)) {
260
+ if (totalParent === (that.windowApi.document as any as HTMLElement)) {
261
+ totalParent = that.windowApi.document.documentElement;
252
262
  }
253
263
  }
254
264
  const findValue = selectorList.find((selectorItem) => {
255
265
  // 判断目标元素是否匹配选择器
256
- if (DOMUtilsContext.matches(eventTarget, selectorItem)) {
266
+ if (that.matches(eventTarget, selectorItem)) {
257
267
  /* 当前目标可以被selector所匹配到 */
258
268
  return true;
259
269
  }
260
270
  /* 在上层与主元素之间寻找可以被selector所匹配到的 */
261
- const $closestMatches = DOMUtilsContext.closest<HTMLElement>(eventTarget, selectorItem);
271
+ const $closestMatches = that.closest<HTMLElement>(eventTarget, selectorItem);
262
272
  if ($closestMatches && totalParent?.contains($closestMatches)) {
263
273
  eventTarget = $closestMatches;
264
274
  return true;
@@ -292,7 +302,7 @@ export class DOMUtilsEvent {
292
302
  /* 获取对象上的事件 */
293
303
  const elementEvents: {
294
304
  [k: string]: DOMUtilsEventListenerOptionsAttribute[];
295
- } = Reflect.get(elementItem, DOMUtilsData.SymbolEvents) || {};
305
+ } = Reflect.get(elementItem, GlobalData.domEventSymbol) || {};
296
306
  /* 初始化对象上的xx事件 */
297
307
  elementEvents[eventName] = elementEvents[eventName] || [];
298
308
  elementEvents[eventName].push({
@@ -302,7 +312,7 @@ export class DOMUtilsEvent {
302
312
  originCallBack: listenerCallBack,
303
313
  });
304
314
  /* 覆盖事件 */
305
- Reflect.set(elementItem, DOMUtilsData.SymbolEvents, elementEvents);
315
+ Reflect.set(elementItem, GlobalData.domEventSymbol, elementEvents);
306
316
  });
307
317
  });
308
318
  }
@@ -440,26 +450,26 @@ export class DOMUtilsEvent {
440
450
  const currentParam: EventListenerOptions | boolean = args1[startIndex];
441
451
  if (typeof currentParam === "boolean") {
442
452
  option.capture = currentParam;
443
- } else if (typeof currentParam === "object" && "capture" in currentParam) {
453
+ } else if (typeof currentParam === "object" && currentParam != null && "capture" in currentParam) {
444
454
  option.capture = currentParam.capture;
445
455
  }
446
456
  return option;
447
457
  }
448
- const DOMUtilsContext = this;
458
+ const that = this;
449
459
  // eslint-disable-next-line prefer-rest-params
450
460
  const args = arguments;
451
461
  if (typeof element === "string") {
452
- element = DOMUtilsContext.selectorAll(element);
462
+ element = that.selectorAll(element);
453
463
  }
454
464
  if (element == null) {
455
465
  return;
456
466
  }
457
- let elementList: HTMLElement[] = [];
467
+ let $elList: HTMLElement[] = [];
458
468
  if (element instanceof NodeList || Array.isArray(element)) {
459
469
  element = element as HTMLElement[];
460
- elementList = [...element];
470
+ $elList = [...element];
461
471
  } else {
462
- elementList.push(element as HTMLElement);
472
+ $elList.push(element as HTMLElement);
463
473
  }
464
474
  let eventTypeList: string[] = [];
465
475
  if (Array.isArray(eventType)) {
@@ -507,18 +517,24 @@ export class DOMUtilsEvent {
507
517
  // 目标函数、事件名、子元素选择器
508
518
  isRemoveAll = true;
509
519
  }
510
- elementList.forEach((elementItem) => {
520
+ if (args.length === 5 && typeof args[4] === "function" && typeof filter !== "function") {
521
+ // 目标函数、事件名、回调函数、事件配置、过滤函数
522
+ filter = option as (
523
+ value: DOMUtilsEventListenerOptionsAttribute,
524
+ index: number,
525
+ array: DOMUtilsEventListenerOptionsAttribute[]
526
+ ) => boolean;
527
+ }
528
+ $elList.forEach(($elItem) => {
511
529
  /* 获取对象上的事件 */
512
530
  const elementEvents: {
513
531
  [key: string]: DOMUtilsEventListenerOptionsAttribute[];
514
- } = Reflect.get(elementItem, DOMUtilsData.SymbolEvents) || {};
532
+ } = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
515
533
  eventTypeList.forEach((eventName) => {
516
- let handlers = elementEvents[eventName] || [];
517
- if (typeof filter === "function") {
518
- handlers = handlers.filter(filter);
519
- }
520
- for (let index = 0; index < handlers.length; index++) {
521
- const handler = handlers[index];
534
+ const handlers = elementEvents[eventName] || [];
535
+ const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
536
+ for (let index = 0; index < filterHandler.length; index++) {
537
+ const handler = filterHandler[index];
522
538
  let flag = true;
523
539
  if (flag && listenerCallBack && handler.originCallBack !== listenerCallBack) {
524
540
  // callback不同
@@ -530,21 +546,28 @@ export class DOMUtilsEvent {
530
546
  flag = false;
531
547
  }
532
548
  }
533
- if (flag && listenerOption.capture !== handler.option.capture) {
549
+ if (
550
+ flag &&
551
+ typeof handler.option.capture === "boolean" &&
552
+ listenerOption.capture !== handler.option.capture
553
+ ) {
534
554
  // 事件的配置项不同
535
555
  flag = false;
536
556
  }
537
557
  if (flag || isRemoveAll) {
538
- elementItem.removeEventListener(eventName, handler.callback, handler.option);
539
- handlers.splice(index--, 1);
558
+ $elItem.removeEventListener(eventName, handler.callback, handler.option);
559
+ const findIndex = handlers.findIndex((item) => item === handler);
560
+ if (findIndex !== -1) {
561
+ handlers.splice(findIndex, 1);
562
+ }
540
563
  }
541
564
  }
542
565
  if (handlers.length === 0) {
543
566
  /* 如果没有任意的handler,那么删除该属性 */
544
- DOMUtilsCommonUtils.delete(elementEvents, eventType);
567
+ CommonUtils.delete(elementEvents, eventType);
545
568
  }
546
569
  });
547
- Reflect.set(elementItem, DOMUtilsData.SymbolEvents, elementEvents);
570
+ Reflect.set($elItem, GlobalData.domEventSymbol, elementEvents);
548
571
  });
549
572
  }
550
573
  /**
@@ -565,18 +588,18 @@ export class DOMUtilsEvent {
565
588
  * @param eventType (可选)需要取消监听的事件
566
589
  */
567
590
  offAll(element: DOMUtilsElementEventType, eventType?: DOMUtils_EventType | DOMUtils_EventType[] | string) {
568
- const DOMUtilsContext = this;
591
+ const that = this;
569
592
  if (typeof element === "string") {
570
- element = DOMUtilsContext.selectorAll(element);
593
+ element = that.selectorAll(element);
571
594
  }
572
595
  if (element == null) {
573
596
  return;
574
597
  }
575
- let elementList: HTMLElement[] = [];
598
+ let $elList: HTMLElement[] = [];
576
599
  if (element instanceof NodeList || Array.isArray(element)) {
577
- elementList = [...(element as HTMLElement[])];
600
+ $elList = [...(element as HTMLElement[])];
578
601
  } else {
579
- elementList.push(element as HTMLElement);
602
+ $elList.push(element as HTMLElement);
580
603
  }
581
604
 
582
605
  let eventTypeList: string[] = [];
@@ -585,12 +608,15 @@ export class DOMUtilsEvent {
585
608
  } else if (typeof eventType === "string") {
586
609
  eventTypeList = eventTypeList.concat(eventType.split(" "));
587
610
  }
588
- elementList.forEach((elementItem) => {
589
- Object.getOwnPropertySymbols(elementItem).forEach((symbolEvents) => {
590
- if (!symbolEvents.toString().startsWith("Symbol(events_")) {
611
+ $elList.forEach(($elItem) => {
612
+ const symbolList = [...new Set([...Object.getOwnPropertySymbols($elItem), GlobalData.domEventSymbol])];
613
+ symbolList.forEach((symbolItem) => {
614
+ if (!symbolItem.toString().startsWith("Symbol(events_")) {
591
615
  return;
592
616
  }
593
- const elementEvents = (elementItem as any)[symbolEvents] || {};
617
+ const elementEvents: {
618
+ [key: string]: DOMUtilsEventListenerOptionsAttribute[];
619
+ } = Reflect.get($elItem, symbolItem) || {};
594
620
  const iterEventNameList = eventTypeList.length ? eventTypeList : Object.keys(elementEvents);
595
621
  iterEventNameList.forEach((eventName) => {
596
622
  const handlers: DOMUtilsEventListenerOptionsAttribute[] = elementEvents[eventName];
@@ -598,12 +624,12 @@ export class DOMUtilsEvent {
598
624
  return;
599
625
  }
600
626
  for (const handler of handlers) {
601
- elementItem.removeEventListener(eventName, handler.callback, {
627
+ $elItem.removeEventListener(eventName, handler.callback, {
602
628
  capture: handler["option"]["capture"],
603
629
  });
604
630
  }
605
- const events = Reflect.get(elementItem, symbolEvents);
606
- DOMUtilsCommonUtils.delete(events, eventName);
631
+ const events = Reflect.get($elItem, symbolItem);
632
+ CommonUtils.delete(events, eventName);
607
633
  });
608
634
  });
609
635
  });
@@ -621,16 +647,16 @@ export class DOMUtilsEvent {
621
647
  if (typeof callback !== "function") {
622
648
  return;
623
649
  }
624
- const DOMUtilsContext = this;
650
+ const that = this;
625
651
  /**
626
652
  * 检测文档是否加载完毕
627
653
  */
628
654
  function checkDOMReadyState() {
629
655
  try {
630
656
  if (
631
- DOMUtilsContext.windowApi.document.readyState === "complete" ||
632
- (DOMUtilsContext.windowApi.document.readyState !== "loading" &&
633
- !(DOMUtilsContext.windowApi.document.documentElement as any).doScroll)
657
+ that.windowApi.document.readyState === "complete" ||
658
+ (that.windowApi.document.readyState !== "loading" &&
659
+ !(that.windowApi.document.documentElement as any).doScroll)
634
660
  ) {
635
661
  return true;
636
662
  } else {
@@ -650,12 +676,12 @@ export class DOMUtilsEvent {
650
676
 
651
677
  const targetList = [
652
678
  {
653
- target: DOMUtilsContext.windowApi.document,
679
+ target: that.windowApi.document,
654
680
  eventType: "DOMContentLoaded",
655
681
  callback: completed,
656
682
  },
657
683
  {
658
- target: DOMUtilsContext.windowApi.window,
684
+ target: that.windowApi.window,
659
685
  eventType: "load",
660
686
  callback: completed,
661
687
  },
@@ -680,7 +706,7 @@ export class DOMUtilsEvent {
680
706
  }
681
707
  if (checkDOMReadyState()) {
682
708
  /* 检查document状态 */
683
- DOMUtilsCommonUtils.setTimeout(callback);
709
+ CommonUtils.setTimeout(callback);
684
710
  } else {
685
711
  /* 添加监听 */
686
712
  addDomReadyListener();
@@ -711,7 +737,7 @@ export class DOMUtilsEvent {
711
737
  * @param element 需要触发的元素|元素数组|window
712
738
  * @param eventType 需要触发的事件
713
739
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
714
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
740
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,false的话就直接触发获取使用DOMUtils进行监听的事件
715
741
  * @example
716
742
  * // 触发元素a.xx的click事件
717
743
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -731,7 +757,7 @@ export class DOMUtilsEvent {
731
757
  * @param element 需要触发的元素|元素数组|window
732
758
  * @param eventType 需要触发的事件
733
759
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
734
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
760
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
735
761
  * @example
736
762
  * // 触发元素a.xx的click事件
737
763
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -746,19 +772,19 @@ export class DOMUtilsEvent {
746
772
  details?: object,
747
773
  useDispatchToTriggerEvent: boolean = true
748
774
  ) {
749
- const DOMUtilsContext = this;
775
+ const that = this;
750
776
  if (typeof element === "string") {
751
- element = DOMUtilsContext.selectorAll(element);
777
+ element = that.selectorAll(element);
752
778
  }
753
779
  if (element == null) {
754
780
  return;
755
781
  }
756
- let elementList = [];
782
+ let $elList = [];
757
783
  if (element instanceof NodeList || Array.isArray(element)) {
758
784
  element = element as HTMLElement[];
759
- elementList = [...element];
785
+ $elList = [...element];
760
786
  } else {
761
- elementList = [element];
787
+ $elList = [element];
762
788
  }
763
789
  let eventTypeList: string[] = [];
764
790
  if (Array.isArray(eventType)) {
@@ -767,27 +793,33 @@ export class DOMUtilsEvent {
767
793
  eventTypeList = eventType.split(" ");
768
794
  }
769
795
 
770
- elementList.forEach((elementItem) => {
796
+ $elList.forEach(($elItem) => {
771
797
  /* 获取对象上的事件 */
772
- const events = elementItem[DOMUtilsData.SymbolEvents] || {};
773
- eventTypeList.forEach((_eventType_) => {
798
+ const elementEvents: {
799
+ [key: string]: DOMUtilsEventListenerOptionsAttribute[];
800
+ } = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
801
+ eventTypeList.forEach((__eventType) => {
774
802
  let event: Event = null as any;
775
803
  if (details && details instanceof Event) {
776
804
  event = details;
777
805
  } else {
778
- event = new Event(_eventType_);
806
+ // 构造事件
807
+ event = new Event(__eventType);
779
808
  if (details) {
780
809
  Object.keys(details).forEach((keyName) => {
781
- (event as any)[keyName] = (details as any)[keyName];
810
+ const value = Reflect.get(details, keyName);
811
+ // 在event上添加属性
812
+ Reflect.set(event, keyName, value);
782
813
  });
783
814
  }
784
815
  }
785
- if (useDispatchToTriggerEvent == false && _eventType_ in events) {
786
- events[_eventType_].forEach((eventsItem: any) => {
816
+ if (useDispatchToTriggerEvent == false && __eventType in elementEvents) {
817
+ // 直接调用监听的事件
818
+ elementEvents[__eventType].forEach((eventsItem: any) => {
787
819
  eventsItem.callback(event);
788
820
  });
789
821
  } else {
790
- elementItem.dispatchEvent(event);
822
+ $elItem.dispatchEvent(event);
791
823
  }
792
824
  });
793
825
  });
@@ -813,24 +845,24 @@ export class DOMUtilsEvent {
813
845
  details?: any,
814
846
  useDispatchToTriggerEvent?: boolean
815
847
  ) {
816
- const DOMUtilsContext = this;
848
+ const that = this;
817
849
  if (typeof element === "string") {
818
- element = DOMUtilsContext.selectorAll(element);
850
+ element = that.selectorAll(element);
819
851
  }
820
852
  if (element == null) {
821
853
  return;
822
854
  }
823
- if (DOMUtilsCommonUtils.isNodeList(element)) {
855
+ if (CommonUtils.isNodeList(element)) {
824
856
  // 设置
825
857
  element.forEach(($ele) => {
826
- DOMUtilsContext.click($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
858
+ that.click($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
827
859
  });
828
860
  return;
829
861
  }
830
862
  if (handler == null) {
831
- DOMUtilsContext.trigger(element, "click", details, useDispatchToTriggerEvent);
863
+ that.trigger(element, "click", details, useDispatchToTriggerEvent);
832
864
  } else {
833
- DOMUtilsContext.on(element, "click", null, handler);
865
+ that.on(element, "click", null, handler);
834
866
  }
835
867
  }
836
868
  /**
@@ -853,24 +885,24 @@ export class DOMUtilsEvent {
853
885
  details?: object,
854
886
  useDispatchToTriggerEvent?: boolean
855
887
  ) {
856
- const DOMUtilsContext = this;
888
+ const that = this;
857
889
  if (typeof element === "string") {
858
- element = DOMUtilsContext.selectorAll(element);
890
+ element = that.selectorAll(element);
859
891
  }
860
892
  if (element == null) {
861
893
  return;
862
894
  }
863
- if (DOMUtilsCommonUtils.isNodeList(element)) {
895
+ if (CommonUtils.isNodeList(element)) {
864
896
  // 设置
865
897
  element.forEach(($ele) => {
866
- DOMUtilsContext.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
898
+ that.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
867
899
  });
868
900
  return;
869
901
  }
870
902
  if (handler === null) {
871
- DOMUtilsContext.trigger(element, "blur", details, useDispatchToTriggerEvent);
903
+ that.trigger(element, "blur", details, useDispatchToTriggerEvent);
872
904
  } else {
873
- DOMUtilsContext.on(element, "blur", null, handler as (event: Event) => void);
905
+ that.on(element, "blur", null, handler as (event: Event) => void);
874
906
  }
875
907
  }
876
908
  /**
@@ -893,24 +925,24 @@ export class DOMUtilsEvent {
893
925
  details?: object,
894
926
  useDispatchToTriggerEvent?: boolean
895
927
  ) {
896
- const DOMUtilsContext = this;
928
+ const that = this;
897
929
  if (typeof element === "string") {
898
- element = DOMUtilsContext.selectorAll(element);
930
+ element = that.selectorAll(element);
899
931
  }
900
932
  if (element == null) {
901
933
  return;
902
934
  }
903
- if (DOMUtilsCommonUtils.isNodeList(element)) {
935
+ if (CommonUtils.isNodeList(element)) {
904
936
  // 设置
905
937
  element.forEach(($ele) => {
906
- DOMUtilsContext.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
938
+ that.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
907
939
  });
908
940
  return;
909
941
  }
910
942
  if (handler == null) {
911
- DOMUtilsContext.trigger(element, "focus", details, useDispatchToTriggerEvent);
943
+ that.trigger(element, "focus", details, useDispatchToTriggerEvent);
912
944
  } else {
913
- DOMUtilsContext.on(element, "focus", null, handler);
945
+ that.on(element, "focus", null, handler);
914
946
  }
915
947
  }
916
948
  /**
@@ -932,22 +964,22 @@ export class DOMUtilsEvent {
932
964
  handler: (this: HTMLElement, event: DOMUtils_Event["hover"]) => void,
933
965
  option?: boolean | DOMUtilsEventListenerOption
934
966
  ) {
935
- const DOMUtilsContext = this;
967
+ const that = this;
936
968
  if (typeof element === "string") {
937
- element = DOMUtilsContext.selectorAll(element);
969
+ element = that.selectorAll(element);
938
970
  }
939
971
  if (element == null) {
940
972
  return;
941
973
  }
942
- if (DOMUtilsCommonUtils.isNodeList(element)) {
974
+ if (CommonUtils.isNodeList(element)) {
943
975
  // 设置
944
976
  element.forEach(($ele) => {
945
- DOMUtilsContext.hover($ele as HTMLElement, handler, option);
977
+ that.hover($ele as HTMLElement, handler, option);
946
978
  });
947
979
  return;
948
980
  }
949
- DOMUtilsContext.on(element, "mouseenter", null, handler, option);
950
- DOMUtilsContext.on(element, "mouseleave", null, handler, option);
981
+ that.on(element, "mouseenter", null, handler, option);
982
+ that.on(element, "mouseleave", null, handler, option);
951
983
  }
952
984
  /**
953
985
  * 当动画结束时触发事件
@@ -960,30 +992,23 @@ export class DOMUtilsEvent {
960
992
  handler: (this: HTMLElement, event: DOMUtils_Event["animationend"]) => void,
961
993
  option?: boolean | DOMUtilsEventListenerOption
962
994
  ) {
963
- const DOMUtilsContext = this;
995
+ const that = this;
964
996
  if (typeof element === "string") {
965
- element = DOMUtilsContext.selector(element)!;
997
+ element = that.selector(element)!;
966
998
  }
967
999
  if (element == null) {
968
1000
  return;
969
1001
  }
970
- // if (DOMUtilsCommonUtils.isNodeList(element)) {
971
- // // 设置
972
- // element.forEach(($ele) => {
973
- // DOMUtilsContext.animationend($ele as HTMLElement, handler, option);
974
- // });
975
- // return;
976
- // }
977
1002
  const defaultOption: DOMUtilsEventListenerOption = {
978
1003
  once: true,
979
1004
  };
980
1005
  Object.assign(defaultOption, option || {});
981
- const eventNameList = DOMUtilsCommonUtils.getAnimationEndNameList();
982
- DOMUtilsContext.on(element, eventNameList, null, handler, defaultOption);
1006
+ const eventNameList = CommonUtils.getAnimationEndNameList();
1007
+ that.on(element, eventNameList, null, handler, defaultOption);
983
1008
  if (!defaultOption.once) {
984
1009
  return {
985
1010
  off() {
986
- DOMUtilsContext.off(element, eventNameList, null, handler, defaultOption);
1011
+ that.off(element, eventNameList, null, handler, defaultOption);
987
1012
  },
988
1013
  };
989
1014
  }
@@ -999,30 +1024,23 @@ export class DOMUtilsEvent {
999
1024
  handler: (this: HTMLElement, event: DOMUtils_Event["transitionend"]) => void,
1000
1025
  option?: boolean | DOMUtilsEventListenerOption
1001
1026
  ) {
1002
- const DOMUtilsContext = this;
1027
+ const that = this;
1003
1028
  if (typeof element === "string") {
1004
- element = DOMUtilsContext.selector(element)!;
1029
+ element = that.selector(element)!;
1005
1030
  }
1006
1031
  if (element == null) {
1007
1032
  return;
1008
1033
  }
1009
- // if (DOMUtilsCommonUtils.isNodeList(element)) {
1010
- // // 设置
1011
- // element.forEach(($ele) => {
1012
- // DOMUtilsContext.transitionend($ele as HTMLElement, handler, option);
1013
- // });
1014
- // return;
1015
- // }
1016
1034
  const defaultOption: DOMUtilsEventListenerOption = {
1017
1035
  once: true,
1018
1036
  };
1019
1037
  Object.assign(defaultOption, option || {});
1020
- const eventNameList = DOMUtilsCommonUtils.getTransitionEndNameList();
1021
- DOMUtilsContext.on(element, eventNameList, null, handler, defaultOption);
1038
+ const eventNameList = CommonUtils.getTransitionEndNameList();
1039
+ that.on(element, eventNameList, null, handler, defaultOption);
1022
1040
  if (!defaultOption.once) {
1023
1041
  return {
1024
1042
  off() {
1025
- DOMUtilsContext.off(element, eventNameList, null, handler, defaultOption);
1043
+ that.off(element, eventNameList, null, handler, defaultOption);
1026
1044
  },
1027
1045
  };
1028
1046
  }
@@ -1047,21 +1065,21 @@ export class DOMUtilsEvent {
1047
1065
  handler: (this: HTMLElement, event: DOMUtils_Event["keyup"]) => void,
1048
1066
  option?: boolean | DOMUtilsEventListenerOption
1049
1067
  ) {
1050
- const DOMUtilsContext = this;
1068
+ const that = this;
1051
1069
  if (element == null) {
1052
1070
  return;
1053
1071
  }
1054
1072
  if (typeof element === "string") {
1055
- element = DOMUtilsContext.selectorAll(element);
1073
+ element = that.selectorAll(element);
1056
1074
  }
1057
- if (DOMUtilsCommonUtils.isNodeList(element)) {
1075
+ if (CommonUtils.isNodeList(element)) {
1058
1076
  // 设置
1059
1077
  element.forEach(($ele) => {
1060
- DOMUtilsContext.keyup($ele as HTMLElement, handler, option);
1078
+ that.keyup($ele as HTMLElement, handler, option);
1061
1079
  });
1062
1080
  return;
1063
1081
  }
1064
- DOMUtilsContext.on(element, "keyup", null, handler, option);
1082
+ that.on(element, "keyup", null, handler, option);
1065
1083
  }
1066
1084
  /**
1067
1085
  * 当按键按下时触发事件
@@ -1083,21 +1101,21 @@ export class DOMUtilsEvent {
1083
1101
  handler: (this: HTMLElement, event: DOMUtils_Event["keydown"]) => void,
1084
1102
  option?: boolean | DOMUtilsEventListenerOption
1085
1103
  ) {
1086
- const DOMUtilsContext = this;
1104
+ const that = this;
1087
1105
  if (element == null) {
1088
1106
  return;
1089
1107
  }
1090
1108
  if (typeof element === "string") {
1091
- element = DOMUtilsContext.selectorAll(element);
1109
+ element = that.selectorAll(element);
1092
1110
  }
1093
- if (DOMUtilsCommonUtils.isNodeList(element)) {
1111
+ if (CommonUtils.isNodeList(element)) {
1094
1112
  // 设置
1095
1113
  element.forEach(($ele) => {
1096
- DOMUtilsContext.keydown($ele as HTMLElement, handler, option);
1114
+ that.keydown($ele as HTMLElement, handler, option);
1097
1115
  });
1098
1116
  return;
1099
1117
  }
1100
- DOMUtilsContext.on(element, "keydown", null, handler, option);
1118
+ that.on(element, "keydown", null, handler, option);
1101
1119
  }
1102
1120
  /**
1103
1121
  * 当按键按下时触发事件
@@ -1119,21 +1137,21 @@ export class DOMUtilsEvent {
1119
1137
  handler: (this: HTMLElement, event: DOMUtils_Event["keypress"]) => void,
1120
1138
  option?: boolean | DOMUtilsEventListenerOption
1121
1139
  ) {
1122
- const DOMUtilsContext = this;
1140
+ const that = this;
1123
1141
  if (element == null) {
1124
1142
  return;
1125
1143
  }
1126
1144
  if (typeof element === "string") {
1127
- element = DOMUtilsContext.selectorAll(element);
1145
+ element = that.selectorAll(element);
1128
1146
  }
1129
- if (DOMUtilsCommonUtils.isNodeList(element)) {
1147
+ if (CommonUtils.isNodeList(element)) {
1130
1148
  // 设置
1131
1149
  element.forEach(($ele) => {
1132
- DOMUtilsContext.keypress($ele as HTMLElement, handler, option);
1150
+ that.keypress($ele as HTMLElement, handler, option);
1133
1151
  });
1134
1152
  return;
1135
1153
  }
1136
- DOMUtilsContext.on(element, "keypress", null, handler, option);
1154
+ that.on(element, "keypress", null, handler, option);
1137
1155
  }
1138
1156
  /**
1139
1157
  * 监听某个元素键盘按键事件或window全局按键事件
@@ -1206,9 +1224,9 @@ export class DOMUtilsEvent {
1206
1224
  ): {
1207
1225
  removeListen(): void;
1208
1226
  } {
1209
- const DOMUtilsContext = this;
1227
+ const that = this;
1210
1228
  if (typeof element === "string") {
1211
- element = DOMUtilsContext.selectorAll(element);
1229
+ element = that.selectorAll(element);
1212
1230
  }
1213
1231
  const keyboardEventCallBack = function (event: KeyboardEvent) {
1214
1232
  /** 键名 */
@@ -1233,258 +1251,58 @@ export class DOMUtilsEvent {
1233
1251
  callback(keyName, keyValue, otherCodeList, event);
1234
1252
  }
1235
1253
  };
1236
- DOMUtilsContext.on(element, eventName, keyboardEventCallBack, options);
1254
+ that.on(element, eventName, keyboardEventCallBack, options);
1237
1255
  return {
1238
1256
  removeListen: () => {
1239
- DOMUtilsContext.off(element, eventName, keyboardEventCallBack, options);
1257
+ that.off(element, eventName, keyboardEventCallBack, options);
1240
1258
  },
1241
1259
  };
1242
1260
  }
1243
1261
  /**
1244
- * 选择器,可使用以下的额外语法
1245
- *
1246
- * + :contains([text]) 作用: 找到包含指定文本内容的指定元素
1247
- * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1248
- * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1249
- * @param selector 选择器
1250
- * @param parent 指定父元素
1251
- * @example
1252
- * DOMUtils.selector("div:contains('测试')")
1253
- * > div.xxx
1254
- * @example
1255
- * DOMUtils.selector("div:empty")
1256
- * > div.xxx
1257
- * @example
1258
- * DOMUtils.selector("div:regexp('^xxxx$')")
1259
- * > div.xxx
1260
- */
1261
- selector<K extends keyof HTMLElementTagNameMap>(
1262
- selector: K,
1263
- parent?: Element | Document | DocumentFragment | ShadowRoot
1264
- ): HTMLElementTagNameMap[K] | undefined;
1265
- selector<E extends Element = HTMLElement>(
1266
- selector: string,
1267
- parent?: Element | Document | DocumentFragment | ShadowRoot
1268
- ): E | undefined;
1269
- selector<E extends Element = HTMLElement>(
1270
- selector: string,
1271
- parent?: Element | Document | DocumentFragment | ShadowRoot
1272
- ) {
1273
- return this.selectorAll<E>(selector, parent)[0];
1274
- }
1275
- /**
1276
- * 选择器,可使用以下的额外语法
1277
- *
1278
- * + :contains([text]) 作用: 找到包含指定文本内容的指定元素
1279
- * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1280
- * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1281
- * @param selector 选择器
1282
- * @param parent 指定父元素
1283
- * @example
1284
- * DOMUtils.selectorAll("div:contains('测试')")
1285
- * > [div.xxx]
1286
- * @example
1287
- * DOMUtils.selectorAll("div:empty")
1288
- * > [div.xxx]
1262
+ * 阻止事件传递
1263
+ * @param event 要阻止传递的事件
1289
1264
  * @example
1290
- * DOMUtils.selectorAll("div:regexp('^xxxx$')")
1291
- * > [div.xxx]
1292
- * @example
1293
- * DOMUtils.selectorAll("div:regexp(/^xxx/ig)")
1294
- * > [div.xxx]
1265
+ * DOMUtils.preventEvent(event);
1295
1266
  */
1296
- selectorAll<K extends keyof HTMLElementTagNameMap>(
1297
- selector: K,
1298
- parent?: Element | Document | DocumentFragment | ShadowRoot
1299
- ): HTMLElementTagNameMap[K][];
1300
- selectorAll<E extends Element = HTMLElement>(
1301
- selector: string,
1302
- parent?: Element | Document | DocumentFragment | ShadowRoot
1303
- ): E[];
1304
- selectorAll<E extends Element = HTMLElement>(
1305
- selector: string,
1306
- parent?: Element | Document | DocumentFragment | ShadowRoot
1307
- ) {
1308
- const context = this;
1309
- parent = parent || context.windowApi.document;
1310
- selector = selector.trim();
1311
- if (selector.match(/[^\s]{1}:empty$/gi)) {
1312
- // empty 语法
1313
- selector = selector.replace(/:empty$/gi, "");
1314
- return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1315
- return $ele?.innerHTML?.trim() === "";
1316
- });
1317
- } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
1318
- // contains 语法
1319
- const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1320
- const text = textMatch![2];
1321
- selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1322
- return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1323
- // @ts-ignore
1324
- return ($ele?.textContent || $ele?.innerText)?.includes(text);
1325
- });
1326
- } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
1327
- // regexp 语法
1328
- const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1329
- let pattern = textMatch![2];
1330
- const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1331
- let flags = "";
1332
- if (flagMatch) {
1333
- pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1334
- flags = flagMatch[3];
1335
- }
1336
- const regexp = new RegExp(pattern, flags);
1337
- selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1338
- return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1339
- // @ts-ignore
1340
- return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
1341
- });
1342
- } else {
1343
- // 普通语法
1344
- return Array.from(parent.querySelectorAll<E>(selector));
1345
- }
1346
- }
1267
+ preventEvent(event: Event): boolean;
1347
1268
  /**
1348
- * 匹配元素,可使用以下的额外语法
1349
- *
1350
- * + :contains([text]) 作用: 找到包含指定文本内容的指定元素
1351
- * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1352
- * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1353
- * @param $el 元素
1354
- * @param selector 选择器
1269
+ * 通过监听事件来主动阻止事件的传递
1270
+ * @param $el 要进行处理的元素
1271
+ * @param eventNameList (可选)要阻止的事件名|列表
1272
+ * @param capture (可选)是否捕获,默认false
1355
1273
  * @example
1356
- * DOMUtils.matches("div:contains('测试')")
1357
- * > true
1358
- * @example
1359
- * DOMUtils.matches("div:empty")
1360
- * > true
1361
- * @example
1362
- * DOMUtils.matches("div:regexp('^xxxx$')")
1363
- * > true
1364
- * @example
1365
- * DOMUtils.matches("div:regexp(/^xxx/ig)")
1366
- * > false
1274
+ * DOMUtils.preventEvent(document.querySelector("a"),"click")
1367
1275
  */
1368
- matches($el: HTMLElement | Element | null | undefined, selector: string): boolean {
1369
- selector = selector.trim();
1370
- if ($el == null) {
1276
+ preventEvent($el: HTMLElement, eventNameList?: string | string[], capture?: boolean): void;
1277
+ preventEvent(...args: any[]) {
1278
+ /**
1279
+ * 阻止事件的默认行为发生,并阻止事件传播
1280
+ */
1281
+ const stopEvent = (event: Event) => {
1282
+ /* 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL */
1283
+ event?.preventDefault();
1284
+ /* 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素 */
1285
+ event?.stopPropagation();
1286
+ /* 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发 */
1287
+ event?.stopImmediatePropagation();
1371
1288
  return false;
1372
- }
1373
-
1374
- if (selector.match(/[^\s]{1}:empty$/gi)) {
1375
- // empty 语法
1376
- selector = selector.replace(/:empty$/gi, "");
1377
- return $el.matches(selector) && $el?.innerHTML?.trim() === "";
1378
- } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
1379
- // contains 语法
1380
- const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1381
- const text = textMatch![2];
1382
- selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1383
- // @ts-ignore
1384
- let content = $el?.textContent || $el?.innerText;
1385
- if (typeof content !== "string") {
1386
- content = "";
1387
- }
1388
- return $el.matches(selector) && content?.includes(text);
1389
- } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
1390
- // regexp 语法
1391
- const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1392
- let pattern = textMatch![2];
1393
- const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1394
- let flags = "";
1395
- if (flagMatch) {
1396
- pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1397
- flags = flagMatch[3];
1398
- }
1399
- const regexp = new RegExp(pattern, flags);
1400
- selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1401
- // @ts-ignore
1402
- let content = $el?.textContent || $el?.innerText;
1403
- if (typeof content !== "string") {
1404
- content = "";
1405
- }
1406
- return $el.matches(selector) && Boolean(content?.match(regexp));
1289
+ };
1290
+ if (args.length === 1) {
1291
+ /* 直接阻止事件 */
1292
+ return stopEvent(args[0]);
1407
1293
  } else {
1408
- // 普通语法
1409
- return $el.matches(selector);
1410
- }
1411
- }
1412
- /**
1413
- * 根据选择器获取上层元素,可使用以下的额外语法
1414
- *
1415
- * + :contains([text]) 作用: 找到包含指定文本内容的指定元素
1416
- * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1417
- * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1418
- * @param $el 元素
1419
- * @param selector 选择器
1420
- * @example
1421
- * DOMUtils.closest("div:contains('测试')")
1422
- * > div.xxx
1423
- * @example
1424
- * DOMUtils.closest("div:empty")
1425
- * > div.xxx
1426
- * @example
1427
- * DOMUtils.closest("div:regexp('^xxxx$')")
1428
- * > div.xxxx
1429
- * @example
1430
- * DOMUtils.closest("div:regexp(/^xxx/ig)")
1431
- * > null
1432
- */
1433
- closest<K extends keyof HTMLElementTagNameMap>(
1434
- $el: HTMLElement | Element,
1435
- selector: string
1436
- ): HTMLElementTagNameMap[K] | null;
1437
- closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null;
1438
- closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null {
1439
- selector = selector.trim();
1440
-
1441
- if (selector.match(/[^\s]{1}:empty$/gi)) {
1442
- // empty 语法
1443
- selector = selector.replace(/:empty$/gi, "");
1444
- const $closest = $el?.closest<E>(selector);
1445
- if ($closest && $closest?.innerHTML?.trim() === "") {
1446
- return $closest;
1294
+ const $el: HTMLElement = args[0];
1295
+ let eventNameList: string | string[] = args[1];
1296
+ const capture: boolean = args[2];
1297
+ /* 添加对应的事件来阻止触发 */
1298
+ if (typeof eventNameList === "string") {
1299
+ eventNameList = [eventNameList];
1447
1300
  }
1448
- return null;
1449
- } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
1450
- // contains 语法
1451
- const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1452
- const text = textMatch![2];
1453
- selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1454
- const $closest = $el?.closest<E>(selector);
1455
- if ($closest) {
1456
- // @ts-ignore
1457
- const content = $el?.textContent || $el?.innerText;
1458
- if (typeof content === "string" && content.includes(text)) {
1459
- return $closest;
1460
- }
1461
- }
1462
- return null;
1463
- } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
1464
- // regexp 语法
1465
- const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1466
- let pattern = textMatch![2];
1467
- const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1468
- let flags = "";
1469
- if (flagMatch) {
1470
- pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1471
- flags = flagMatch[3];
1472
- }
1473
- const regexp = new RegExp(pattern, flags);
1474
- selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1475
- const $closest = $el?.closest<E>(selector);
1476
- if ($closest) {
1477
- // @ts-ignore
1478
- const content = $el?.textContent || $el?.innerText;
1479
- if (typeof content === "string" && content.match(regexp)) {
1480
- return $closest;
1481
- }
1482
- }
1483
- return null;
1484
- } else {
1485
- // 普通语法
1486
- const $closest = $el?.closest<E>(selector);
1487
- return $closest;
1301
+ this.on($el, eventNameList, stopEvent, { capture: Boolean(capture) });
1488
1302
  }
1489
1303
  }
1490
1304
  }
1305
+
1306
+ const elementEvent = new ElementEvent();
1307
+
1308
+ export { elementEvent, ElementEvent };