@whitesev/domutils 1.6.8 → 1.7.1

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 (57) hide show
  1. package/dist/index.amd.js +1962 -1062
  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 +1962 -1062
  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 +1962 -1062
  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 +1962 -1062
  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 +1962 -1062
  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 +1962 -1062
  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} +20 -8
  27. package/dist/types/src/ElementAnimate.d.ts +89 -0
  28. package/dist/types/src/{DOMUtilsEvent.d.ts → ElementEvent.d.ts} +27 -92
  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/DOMUtilsEvent.d.ts +23 -0
  37. package/dist/types/src/types/env.d.ts +9 -0
  38. package/dist/types/src/types/global.d.ts +0 -2
  39. package/dist/types/src/types/gm.d.ts +0 -4
  40. package/index.ts +1 -1
  41. package/package.json +13 -12
  42. package/src/{DOMUtilsCommonUtils.ts → CommonUtils.ts} +25 -11
  43. package/src/ElementAnimate.ts +290 -0
  44. package/src/{DOMUtilsEvent.ts → ElementEvent.ts} +220 -396
  45. package/src/ElementHandler.ts +43 -0
  46. package/src/ElementSelector.ts +260 -0
  47. package/src/ElementWait.ts +699 -0
  48. package/src/GlobalData.ts +5 -0
  49. package/src/{DOMUtilsOriginPrototype.ts → OriginPrototype.ts} +1 -3
  50. package/src/Utils.ts +386 -0
  51. package/src/{DOMUtils.ts → index.ts} +678 -757
  52. package/src/types/DOMUtilsEvent.d.ts +23 -0
  53. package/src/types/env.d.ts +9 -0
  54. package/src/types/global.d.ts +0 -2
  55. package/src/types/gm.d.ts +0 -4
  56. package/dist/types/src/DOMUtilsData.d.ts +0 -5
  57. package/src/DOMUtilsData.ts +0 -7
@@ -1,9 +1,11 @@
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,
8
+ DOMUtilsAddEventListenerResult,
7
9
  DOMUtilsElementEventType,
8
10
  DOMUtilsEventListenerOption,
9
11
  DOMUtilsEventListenerOptionsAttribute,
@@ -12,11 +14,20 @@ import type { DOMUtilsTargetElementType } from "./types/global";
12
14
  import type { WindowApiOption } from "./types/WindowApi";
13
15
  import { WindowApi } from "./WindowApi";
14
16
 
15
- export class DOMUtilsEvent {
17
+ class ElementEvent extends ElementAnimate {
16
18
  windowApi: typeof WindowApi.prototype;
17
19
  constructor(windowApiOption?: WindowApiOption) {
20
+ super(windowApiOption);
18
21
  this.windowApi = new WindowApi(windowApiOption);
19
22
  }
23
+ /** 获取 animationend 在各个浏览器的兼容名 */
24
+ getAnimationEndNameList() {
25
+ return CommonUtils.getAnimationEndNameList();
26
+ }
27
+ /** 获取 transitionend 在各个浏览器的兼容名 */
28
+ getTransitionEndNameList() {
29
+ return CommonUtils.getTransitionEndNameList();
30
+ }
20
31
  /**
21
32
  * 绑定事件
22
33
  * @param element 需要绑定的元素|元素数组|window
@@ -40,7 +51,7 @@ export class DOMUtilsEvent {
40
51
  eventType: T | T[],
41
52
  callback: (this: HTMLElement, event: DOMUtils_Event[T]) => void,
42
53
  option?: DOMUtilsEventListenerOption | boolean
43
- ): void;
54
+ ): DOMUtilsAddEventListenerResult;
44
55
  /**
45
56
  * 绑定事件
46
57
  * @param element 需要绑定的元素|元素数组|window
@@ -64,7 +75,7 @@ export class DOMUtilsEvent {
64
75
  eventType: string | string[],
65
76
  callback: (this: HTMLElement, event: T) => void,
66
77
  option?: DOMUtilsEventListenerOption | boolean
67
- ): void;
78
+ ): DOMUtilsAddEventListenerResult;
68
79
  /**
69
80
  * 绑定事件
70
81
  * @param element 需要绑定的元素|元素数组|window
@@ -95,7 +106,7 @@ export class DOMUtilsEvent {
95
106
  selector: string | string[] | undefined | null,
96
107
  callback: (this: HTMLElement, event: DOMUtils_Event[T], selectorTarget: HTMLElement) => void,
97
108
  option?: DOMUtilsEventListenerOption | boolean
98
- ): void;
109
+ ): DOMUtilsAddEventListenerResult;
99
110
  /**
100
111
  * 绑定事件
101
112
  * @param element 需要绑定的元素|元素数组|window
@@ -126,7 +137,7 @@ export class DOMUtilsEvent {
126
137
  selector: string | string[] | undefined | null,
127
138
  callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void,
128
139
  option?: DOMUtilsEventListenerOption | boolean
129
- ): void;
140
+ ): DOMUtilsAddEventListenerResult;
130
141
  on<T extends Event>(
131
142
  element: HTMLElement | string | NodeList | HTMLElement[] | Window | Document | Element | null | typeof globalThis,
132
143
  eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
@@ -141,7 +152,7 @@ export class DOMUtilsEvent {
141
152
  | DOMUtilsEventListenerOption
142
153
  | boolean,
143
154
  option?: DOMUtilsEventListenerOption | boolean
144
- ) {
155
+ ): DOMUtilsAddEventListenerResult {
145
156
  /**
146
157
  * 获取option配置
147
158
  * @param args
@@ -173,37 +184,35 @@ export class DOMUtilsEvent {
173
184
  return option;
174
185
  }
175
186
 
176
- const DOMUtilsContext = this;
187
+ const that = this;
177
188
  // eslint-disable-next-line prefer-rest-params
178
189
  const args = arguments;
179
190
  if (typeof element === "string") {
180
- element = DOMUtilsContext.selectorAll(element);
191
+ element = that.selectorAll(element);
181
192
  }
182
193
  if (element == null) {
183
- return;
194
+ return {
195
+ off() {},
196
+ trigger() {},
197
+ };
184
198
  }
185
- let elementList: HTMLElement[] = [];
199
+ let $elList: (Element | Document | Window)[] = [];
186
200
  if (element instanceof NodeList || Array.isArray(element)) {
187
- element = element as HTMLElement[];
188
- elementList = [...element];
201
+ $elList = $elList.concat(Array.from(element as Element[]));
189
202
  } else {
190
- elementList.push(element as HTMLElement);
203
+ $elList.push(element as Element);
191
204
  }
192
205
  // 事件名
193
206
  let eventTypeList: string[] = [];
194
207
  if (Array.isArray(eventType)) {
195
- eventTypeList = eventTypeList.concat(
196
- eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
197
- );
208
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
198
209
  } else if (typeof eventType === "string") {
199
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
210
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
200
211
  }
201
212
  // 子元素选择器
202
213
  let selectorList: string[] = [];
203
214
  if (Array.isArray(selector)) {
204
- selectorList = selectorList.concat(
205
- selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
206
- );
215
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
207
216
  } else if (typeof selector === "string") {
208
217
  selectorList.push(selector);
209
218
  }
@@ -230,10 +239,10 @@ export class DOMUtilsEvent {
230
239
  */
231
240
  function checkOptionOnceToRemoveEventListener() {
232
241
  if (listenerOption.once) {
233
- DOMUtilsContext.off(element, eventType as any, selector as any, callback as any, option);
242
+ that.off(element, eventType as any, selector as any, callback as any, option);
234
243
  }
235
244
  }
236
- elementList.forEach((elementItem) => {
245
+ $elList.forEach((elementItem) => {
237
246
  /**
238
247
  * 事件回调
239
248
  * @param event
@@ -246,20 +255,20 @@ export class DOMUtilsEvent {
246
255
  ? (event.composedPath()[0] as HTMLElement)
247
256
  : (event.target as HTMLElement);
248
257
  let totalParent = elementItem;
249
- if (DOMUtilsCommonUtils.isWin(totalParent)) {
250
- if (totalParent === (DOMUtilsContext.windowApi.document as any as HTMLElement)) {
251
- totalParent = DOMUtilsContext.windowApi.document.documentElement;
258
+ if (CommonUtils.isWin(totalParent)) {
259
+ if (totalParent === (that.windowApi.document as any as HTMLElement)) {
260
+ totalParent = that.windowApi.document.documentElement;
252
261
  }
253
262
  }
254
263
  const findValue = selectorList.find((selectorItem) => {
255
264
  // 判断目标元素是否匹配选择器
256
- if (DOMUtilsContext.matches(eventTarget, selectorItem)) {
265
+ if (that.matches(eventTarget, selectorItem)) {
257
266
  /* 当前目标可以被selector所匹配到 */
258
267
  return true;
259
268
  }
260
269
  /* 在上层与主元素之间寻找可以被selector所匹配到的 */
261
- const $closestMatches = DOMUtilsContext.closest<HTMLElement>(eventTarget, selectorItem);
262
- if ($closestMatches && totalParent?.contains($closestMatches)) {
270
+ const $closestMatches = that.closest<HTMLElement>(eventTarget, selectorItem);
271
+ if ($closestMatches && (<HTMLElement>totalParent)?.contains?.($closestMatches)) {
263
272
  eventTarget = $closestMatches;
264
273
  return true;
265
274
  }
@@ -281,7 +290,7 @@ export class DOMUtilsEvent {
281
290
  }
282
291
  } else {
283
292
  // 这时候的this指向监听的元素
284
- listenerCallBack.call(elementItem, event as any);
293
+ listenerCallBack.call(elementItem as HTMLElement, event as any);
285
294
  checkOptionOnceToRemoveEventListener();
286
295
  }
287
296
  }
@@ -292,7 +301,7 @@ export class DOMUtilsEvent {
292
301
  /* 获取对象上的事件 */
293
302
  const elementEvents: {
294
303
  [k: string]: DOMUtilsEventListenerOptionsAttribute[];
295
- } = Reflect.get(elementItem, DOMUtilsData.SymbolEvents) || {};
304
+ } = Reflect.get(elementItem, GlobalData.domEventSymbol) || {};
296
305
  /* 初始化对象上的xx事件 */
297
306
  elementEvents[eventName] = elementEvents[eventName] || [];
298
307
  elementEvents[eventName].push({
@@ -302,9 +311,33 @@ export class DOMUtilsEvent {
302
311
  originCallBack: listenerCallBack,
303
312
  });
304
313
  /* 覆盖事件 */
305
- Reflect.set(elementItem, DOMUtilsData.SymbolEvents, elementEvents);
314
+ Reflect.set(elementItem, GlobalData.domEventSymbol, elementEvents);
306
315
  });
307
316
  });
317
+
318
+ return {
319
+ /**
320
+ * 取消绑定的监听事件
321
+ * @param filter (可选)过滤函数,对元素属性上的事件进行过滤出想要删除的事件
322
+ */
323
+ off(
324
+ filter?: (
325
+ value: DOMUtilsEventListenerOptionsAttribute,
326
+ index: number,
327
+ array: DOMUtilsEventListenerOptionsAttribute[]
328
+ ) => boolean
329
+ ) {
330
+ that.off($elList, eventTypeList, selectorList, listenerCallBack, listenerOption, filter);
331
+ },
332
+ /**
333
+ * 主动触发事件
334
+ * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
335
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
336
+ */
337
+ trigger(details?: object, useDispatchToTriggerEvent?: boolean) {
338
+ that.trigger($elList, eventTypeList, details, useDispatchToTriggerEvent);
339
+ },
340
+ };
308
341
  }
309
342
  /**
310
343
  * 取消绑定事件
@@ -445,36 +478,32 @@ export class DOMUtilsEvent {
445
478
  }
446
479
  return option;
447
480
  }
448
- const DOMUtilsContext = this;
481
+ const that = this;
449
482
  // eslint-disable-next-line prefer-rest-params
450
483
  const args = arguments;
451
484
  if (typeof element === "string") {
452
- element = DOMUtilsContext.selectorAll(element);
485
+ element = that.selectorAll(element);
453
486
  }
454
487
  if (element == null) {
455
488
  return;
456
489
  }
457
- let elementList: HTMLElement[] = [];
490
+ let $elList: HTMLElement[] = [];
458
491
  if (element instanceof NodeList || Array.isArray(element)) {
459
492
  element = element as HTMLElement[];
460
- elementList = [...element];
493
+ $elList = $elList.concat(Array.from(element));
461
494
  } else {
462
- elementList.push(element as HTMLElement);
495
+ $elList.push(element as HTMLElement);
463
496
  }
464
497
  let eventTypeList: string[] = [];
465
498
  if (Array.isArray(eventType)) {
466
- eventTypeList = eventTypeList.concat(
467
- eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
468
- );
499
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
469
500
  } else if (typeof eventType === "string") {
470
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
501
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
471
502
  }
472
503
  // 子元素选择器
473
504
  let selectorList: string[] = [];
474
505
  if (Array.isArray(selector)) {
475
- selectorList = selectorList.concat(
476
- selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
477
- );
506
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
478
507
  } else if (typeof selector === "string") {
479
508
  selectorList.push(selector);
480
509
  }
@@ -515,11 +544,11 @@ export class DOMUtilsEvent {
515
544
  array: DOMUtilsEventListenerOptionsAttribute[]
516
545
  ) => boolean;
517
546
  }
518
- elementList.forEach((elementItem) => {
547
+ $elList.forEach(($elItem) => {
519
548
  /* 获取对象上的事件 */
520
549
  const elementEvents: {
521
550
  [key: string]: DOMUtilsEventListenerOptionsAttribute[];
522
- } = Reflect.get(elementItem, DOMUtilsData.SymbolEvents) || {};
551
+ } = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
523
552
  eventTypeList.forEach((eventName) => {
524
553
  const handlers = elementEvents[eventName] || [];
525
554
  const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
@@ -545,7 +574,7 @@ export class DOMUtilsEvent {
545
574
  flag = false;
546
575
  }
547
576
  if (flag || isRemoveAll) {
548
- elementItem.removeEventListener(eventName, handler.callback, handler.option);
577
+ $elItem.removeEventListener(eventName, handler.callback, handler.option);
549
578
  const findIndex = handlers.findIndex((item) => item === handler);
550
579
  if (findIndex !== -1) {
551
580
  handlers.splice(findIndex, 1);
@@ -554,10 +583,10 @@ export class DOMUtilsEvent {
554
583
  }
555
584
  if (handlers.length === 0) {
556
585
  /* 如果没有任意的handler,那么删除该属性 */
557
- DOMUtilsCommonUtils.delete(elementEvents, eventType);
586
+ CommonUtils.delete(elementEvents, eventType);
558
587
  }
559
588
  });
560
- Reflect.set(elementItem, DOMUtilsData.SymbolEvents, elementEvents);
589
+ Reflect.set($elItem, GlobalData.domEventSymbol, elementEvents);
561
590
  });
562
591
  }
563
592
  /**
@@ -578,18 +607,18 @@ export class DOMUtilsEvent {
578
607
  * @param eventType (可选)需要取消监听的事件
579
608
  */
580
609
  offAll(element: DOMUtilsElementEventType, eventType?: DOMUtils_EventType | DOMUtils_EventType[] | string) {
581
- const DOMUtilsContext = this;
610
+ const that = this;
582
611
  if (typeof element === "string") {
583
- element = DOMUtilsContext.selectorAll(element);
612
+ element = that.selectorAll(element);
584
613
  }
585
614
  if (element == null) {
586
615
  return;
587
616
  }
588
- let elementList: HTMLElement[] = [];
617
+ let $elList: (Element | Document | Window | typeof globalThis | Node | ChildNode | EventTarget)[] = [];
589
618
  if (element instanceof NodeList || Array.isArray(element)) {
590
- elementList = [...(element as HTMLElement[])];
619
+ $elList = $elList.concat(Array.from(element as HTMLElement[]));
591
620
  } else {
592
- elementList.push(element as HTMLElement);
621
+ $elList.push(element);
593
622
  }
594
623
 
595
624
  let eventTypeList: string[] = [];
@@ -598,12 +627,15 @@ export class DOMUtilsEvent {
598
627
  } else if (typeof eventType === "string") {
599
628
  eventTypeList = eventTypeList.concat(eventType.split(" "));
600
629
  }
601
- elementList.forEach((elementItem) => {
602
- Object.getOwnPropertySymbols(elementItem).forEach((symbolEvents) => {
603
- if (!symbolEvents.toString().startsWith("Symbol(events_")) {
630
+ $elList.forEach(($elItem) => {
631
+ const symbolList = [...new Set([...Object.getOwnPropertySymbols($elItem), GlobalData.domEventSymbol])];
632
+ symbolList.forEach((symbolItem) => {
633
+ if (!symbolItem.toString().startsWith("Symbol(events_")) {
604
634
  return;
605
635
  }
606
- const elementEvents = (elementItem as any)[symbolEvents] || {};
636
+ const elementEvents: {
637
+ [key: string]: DOMUtilsEventListenerOptionsAttribute[];
638
+ } = Reflect.get($elItem, symbolItem) || {};
607
639
  const iterEventNameList = eventTypeList.length ? eventTypeList : Object.keys(elementEvents);
608
640
  iterEventNameList.forEach((eventName) => {
609
641
  const handlers: DOMUtilsEventListenerOptionsAttribute[] = elementEvents[eventName];
@@ -611,12 +643,12 @@ export class DOMUtilsEvent {
611
643
  return;
612
644
  }
613
645
  for (const handler of handlers) {
614
- elementItem.removeEventListener(eventName, handler.callback, {
646
+ $elItem.removeEventListener(eventName, handler.callback, {
615
647
  capture: handler["option"]["capture"],
616
648
  });
617
649
  }
618
- const events = Reflect.get(elementItem, symbolEvents);
619
- DOMUtilsCommonUtils.delete(events, eventName);
650
+ const events = Reflect.get($elItem, symbolItem);
651
+ CommonUtils.delete(events, eventName);
620
652
  });
621
653
  });
622
654
  });
@@ -634,16 +666,16 @@ export class DOMUtilsEvent {
634
666
  if (typeof callback !== "function") {
635
667
  return;
636
668
  }
637
- const DOMUtilsContext = this;
669
+ const that = this;
638
670
  /**
639
671
  * 检测文档是否加载完毕
640
672
  */
641
673
  function checkDOMReadyState() {
642
674
  try {
643
675
  if (
644
- DOMUtilsContext.windowApi.document.readyState === "complete" ||
645
- (DOMUtilsContext.windowApi.document.readyState !== "loading" &&
646
- !(DOMUtilsContext.windowApi.document.documentElement as any).doScroll)
676
+ that.windowApi.document.readyState === "complete" ||
677
+ (that.windowApi.document.readyState !== "loading" &&
678
+ !(that.windowApi.document.documentElement as any).doScroll)
647
679
  ) {
648
680
  return true;
649
681
  } else {
@@ -663,12 +695,12 @@ export class DOMUtilsEvent {
663
695
 
664
696
  const targetList = [
665
697
  {
666
- target: DOMUtilsContext.windowApi.document,
698
+ target: that.windowApi.document,
667
699
  eventType: "DOMContentLoaded",
668
700
  callback: completed,
669
701
  },
670
702
  {
671
- target: DOMUtilsContext.windowApi.window,
703
+ target: that.windowApi.window,
672
704
  eventType: "load",
673
705
  callback: completed,
674
706
  },
@@ -693,7 +725,7 @@ export class DOMUtilsEvent {
693
725
  }
694
726
  if (checkDOMReadyState()) {
695
727
  /* 检查document状态 */
696
- DOMUtilsCommonUtils.setTimeout(callback);
728
+ CommonUtils.setTimeout(callback, 0);
697
729
  } else {
698
730
  /* 添加监听 */
699
731
  addDomReadyListener();
@@ -704,7 +736,7 @@ export class DOMUtilsEvent {
704
736
  * @param element 需要触发的元素|元素数组|window
705
737
  * @param eventType 需要触发的事件
706
738
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
707
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
739
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
708
740
  * @example
709
741
  * // 触发元素a.xx的click事件
710
742
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -715,7 +747,7 @@ export class DOMUtilsEvent {
715
747
  */
716
748
  trigger(
717
749
  element: DOMUtilsTargetElementType | Element | DocumentFragment | any[] | typeof globalThis | Window | Document,
718
- eventType: string,
750
+ eventType: string | string[],
719
751
  details?: object,
720
752
  useDispatchToTriggerEvent?: boolean
721
753
  ): void;
@@ -724,7 +756,7 @@ export class DOMUtilsEvent {
724
756
  * @param element 需要触发的元素|元素数组|window
725
757
  * @param eventType 需要触发的事件
726
758
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
727
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
759
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
728
760
  * @example
729
761
  * // 触发元素a.xx的click事件
730
762
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -734,7 +766,7 @@ export class DOMUtilsEvent {
734
766
  * DOMUtils.trigger("a.xx",["click","tap","hover"])
735
767
  */
736
768
  trigger(
737
- element: HTMLElement | string | NodeList | any[] | Window | Document,
769
+ element: Element | string | NodeList | any[] | Window | Document,
738
770
  eventType: DOMUtils_EventType | DOMUtils_EventType[],
739
771
  details?: object,
740
772
  useDispatchToTriggerEvent?: boolean
@@ -744,7 +776,7 @@ export class DOMUtilsEvent {
744
776
  * @param element 需要触发的元素|元素数组|window
745
777
  * @param eventType 需要触发的事件
746
778
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
747
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
779
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
748
780
  * @example
749
781
  * // 触发元素a.xx的click事件
750
782
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -754,53 +786,59 @@ export class DOMUtilsEvent {
754
786
  * DOMUtils.trigger("a.xx",["click","tap","hover"])
755
787
  */
756
788
  trigger(
757
- element: HTMLElement | string | NodeList | any[] | Window | Document,
758
- eventType: DOMUtils_EventType | DOMUtils_EventType[] | string,
789
+ element: Element | string | NodeList | any[] | Window | Document,
790
+ eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
759
791
  details?: object,
760
792
  useDispatchToTriggerEvent: boolean = true
761
793
  ) {
762
- const DOMUtilsContext = this;
794
+ const that = this;
763
795
  if (typeof element === "string") {
764
- element = DOMUtilsContext.selectorAll(element);
796
+ element = that.selectorAll(element);
765
797
  }
766
798
  if (element == null) {
767
799
  return;
768
800
  }
769
- let elementList = [];
801
+ let $elList: (Document | Window | Element)[] = [];
770
802
  if (element instanceof NodeList || Array.isArray(element)) {
771
- element = element as HTMLElement[];
772
- elementList = [...element];
803
+ $elList = $elList.concat(Array.from(element));
773
804
  } else {
774
- elementList = [element];
805
+ $elList.push(element);
775
806
  }
776
807
  let eventTypeList: string[] = [];
777
808
  if (Array.isArray(eventType)) {
778
- eventTypeList = eventType as string[];
809
+ eventTypeList = eventType.filter((it) => typeof it === "string" && it.trim() !== "");
779
810
  } else if (typeof eventType === "string") {
780
811
  eventTypeList = eventType.split(" ");
781
812
  }
782
813
 
783
- elementList.forEach((elementItem) => {
814
+ $elList.forEach(($elItem) => {
784
815
  /* 获取对象上的事件 */
785
- const events = elementItem[DOMUtilsData.SymbolEvents] || {};
786
- eventTypeList.forEach((_eventType_) => {
816
+ const elementEvents: {
817
+ [key: string]: DOMUtilsEventListenerOptionsAttribute[];
818
+ } = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
819
+ eventTypeList.forEach((eventTypeItem) => {
787
820
  let event: Event = null as any;
788
821
  if (details && details instanceof Event) {
789
822
  event = details;
790
823
  } else {
791
- event = new Event(_eventType_);
824
+ // 构造事件
825
+ event = new Event(eventTypeItem);
792
826
  if (details) {
793
- Object.keys(details).forEach((keyName) => {
794
- (event as any)[keyName] = (details as any)[keyName];
827
+ const detailKeys = Object.keys(details);
828
+ detailKeys.forEach((keyName) => {
829
+ const value = Reflect.get(details, keyName);
830
+ // 在event上添加属性
831
+ Reflect.set(event, keyName, value);
795
832
  });
796
833
  }
797
834
  }
798
- if (useDispatchToTriggerEvent == false && _eventType_ in events) {
799
- events[_eventType_].forEach((eventsItem: any) => {
835
+ if (useDispatchToTriggerEvent == false && eventTypeItem in elementEvents) {
836
+ // 直接调用监听的事件
837
+ elementEvents[eventTypeItem].forEach((eventsItem: any) => {
800
838
  eventsItem.callback(event);
801
839
  });
802
840
  } else {
803
- elementItem.dispatchEvent(event);
841
+ $elItem.dispatchEvent(event);
804
842
  }
805
843
  });
806
844
  });
@@ -826,24 +864,24 @@ export class DOMUtilsEvent {
826
864
  details?: any,
827
865
  useDispatchToTriggerEvent?: boolean
828
866
  ) {
829
- const DOMUtilsContext = this;
867
+ const that = this;
830
868
  if (typeof element === "string") {
831
- element = DOMUtilsContext.selectorAll(element);
869
+ element = that.selectorAll(element);
832
870
  }
833
871
  if (element == null) {
834
872
  return;
835
873
  }
836
- if (DOMUtilsCommonUtils.isNodeList(element)) {
874
+ if (CommonUtils.isNodeList(element)) {
837
875
  // 设置
838
876
  element.forEach(($ele) => {
839
- DOMUtilsContext.click($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
877
+ that.click($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
840
878
  });
841
879
  return;
842
880
  }
843
881
  if (handler == null) {
844
- DOMUtilsContext.trigger(element, "click", details, useDispatchToTriggerEvent);
882
+ that.trigger(element, "click", details, useDispatchToTriggerEvent);
845
883
  } else {
846
- DOMUtilsContext.on(element, "click", null, handler);
884
+ that.on(element, "click", null, handler);
847
885
  }
848
886
  }
849
887
  /**
@@ -866,24 +904,24 @@ export class DOMUtilsEvent {
866
904
  details?: object,
867
905
  useDispatchToTriggerEvent?: boolean
868
906
  ) {
869
- const DOMUtilsContext = this;
907
+ const that = this;
870
908
  if (typeof element === "string") {
871
- element = DOMUtilsContext.selectorAll(element);
909
+ element = that.selectorAll(element);
872
910
  }
873
911
  if (element == null) {
874
912
  return;
875
913
  }
876
- if (DOMUtilsCommonUtils.isNodeList(element)) {
914
+ if (CommonUtils.isNodeList(element)) {
877
915
  // 设置
878
916
  element.forEach(($ele) => {
879
- DOMUtilsContext.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
917
+ that.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
880
918
  });
881
919
  return;
882
920
  }
883
921
  if (handler === null) {
884
- DOMUtilsContext.trigger(element, "blur", details, useDispatchToTriggerEvent);
922
+ that.trigger(element, "blur", details, useDispatchToTriggerEvent);
885
923
  } else {
886
- DOMUtilsContext.on(element, "blur", null, handler as (event: Event) => void);
924
+ that.on(element, "blur", null, handler as (event: Event) => void);
887
925
  }
888
926
  }
889
927
  /**
@@ -906,24 +944,24 @@ export class DOMUtilsEvent {
906
944
  details?: object,
907
945
  useDispatchToTriggerEvent?: boolean
908
946
  ) {
909
- const DOMUtilsContext = this;
947
+ const that = this;
910
948
  if (typeof element === "string") {
911
- element = DOMUtilsContext.selectorAll(element);
949
+ element = that.selectorAll(element);
912
950
  }
913
951
  if (element == null) {
914
952
  return;
915
953
  }
916
- if (DOMUtilsCommonUtils.isNodeList(element)) {
954
+ if (CommonUtils.isNodeList(element)) {
917
955
  // 设置
918
956
  element.forEach(($ele) => {
919
- DOMUtilsContext.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
957
+ that.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
920
958
  });
921
959
  return;
922
960
  }
923
961
  if (handler == null) {
924
- DOMUtilsContext.trigger(element, "focus", details, useDispatchToTriggerEvent);
962
+ that.trigger(element, "focus", details, useDispatchToTriggerEvent);
925
963
  } else {
926
- DOMUtilsContext.on(element, "focus", null, handler);
964
+ that.on(element, "focus", null, handler);
927
965
  }
928
966
  }
929
967
  /**
@@ -945,22 +983,22 @@ export class DOMUtilsEvent {
945
983
  handler: (this: HTMLElement, event: DOMUtils_Event["hover"]) => void,
946
984
  option?: boolean | DOMUtilsEventListenerOption
947
985
  ) {
948
- const DOMUtilsContext = this;
986
+ const that = this;
949
987
  if (typeof element === "string") {
950
- element = DOMUtilsContext.selectorAll(element);
988
+ element = that.selectorAll(element);
951
989
  }
952
990
  if (element == null) {
953
991
  return;
954
992
  }
955
- if (DOMUtilsCommonUtils.isNodeList(element)) {
993
+ if (CommonUtils.isNodeList(element)) {
956
994
  // 设置
957
995
  element.forEach(($ele) => {
958
- DOMUtilsContext.hover($ele as HTMLElement, handler, option);
996
+ that.hover($ele as HTMLElement, handler, option);
959
997
  });
960
998
  return;
961
999
  }
962
- DOMUtilsContext.on(element, "mouseenter", null, handler, option);
963
- DOMUtilsContext.on(element, "mouseleave", null, handler, option);
1000
+ that.on(element, "mouseenter", null, handler, option);
1001
+ that.on(element, "mouseleave", null, handler, option);
964
1002
  }
965
1003
  /**
966
1004
  * 当动画结束时触发事件
@@ -973,30 +1011,23 @@ export class DOMUtilsEvent {
973
1011
  handler: (this: HTMLElement, event: DOMUtils_Event["animationend"]) => void,
974
1012
  option?: boolean | DOMUtilsEventListenerOption
975
1013
  ) {
976
- const DOMUtilsContext = this;
1014
+ const that = this;
977
1015
  if (typeof element === "string") {
978
- element = DOMUtilsContext.selector(element)!;
1016
+ element = that.selector(element)!;
979
1017
  }
980
1018
  if (element == null) {
981
1019
  return;
982
1020
  }
983
- // if (DOMUtilsCommonUtils.isNodeList(element)) {
984
- // // 设置
985
- // element.forEach(($ele) => {
986
- // DOMUtilsContext.animationend($ele as HTMLElement, handler, option);
987
- // });
988
- // return;
989
- // }
990
1021
  const defaultOption: DOMUtilsEventListenerOption = {
991
1022
  once: true,
992
1023
  };
993
1024
  Object.assign(defaultOption, option || {});
994
- const eventNameList = DOMUtilsCommonUtils.getAnimationEndNameList();
995
- DOMUtilsContext.on(element, eventNameList, null, handler, defaultOption);
1025
+ const eventNameList = CommonUtils.getAnimationEndNameList();
1026
+ that.on(element, eventNameList, null, handler, defaultOption);
996
1027
  if (!defaultOption.once) {
997
1028
  return {
998
1029
  off() {
999
- DOMUtilsContext.off(element, eventNameList, null, handler, defaultOption);
1030
+ that.off(element, eventNameList, null, handler, defaultOption);
1000
1031
  },
1001
1032
  };
1002
1033
  }
@@ -1012,30 +1043,23 @@ export class DOMUtilsEvent {
1012
1043
  handler: (this: HTMLElement, event: DOMUtils_Event["transitionend"]) => void,
1013
1044
  option?: boolean | DOMUtilsEventListenerOption
1014
1045
  ) {
1015
- const DOMUtilsContext = this;
1046
+ const that = this;
1016
1047
  if (typeof element === "string") {
1017
- element = DOMUtilsContext.selector(element)!;
1048
+ element = that.selector(element)!;
1018
1049
  }
1019
1050
  if (element == null) {
1020
1051
  return;
1021
1052
  }
1022
- // if (DOMUtilsCommonUtils.isNodeList(element)) {
1023
- // // 设置
1024
- // element.forEach(($ele) => {
1025
- // DOMUtilsContext.transitionend($ele as HTMLElement, handler, option);
1026
- // });
1027
- // return;
1028
- // }
1029
1053
  const defaultOption: DOMUtilsEventListenerOption = {
1030
1054
  once: true,
1031
1055
  };
1032
1056
  Object.assign(defaultOption, option || {});
1033
- const eventNameList = DOMUtilsCommonUtils.getTransitionEndNameList();
1034
- DOMUtilsContext.on(element, eventNameList, null, handler, defaultOption);
1057
+ const eventNameList = CommonUtils.getTransitionEndNameList();
1058
+ that.on(element, eventNameList, null, handler, defaultOption);
1035
1059
  if (!defaultOption.once) {
1036
1060
  return {
1037
1061
  off() {
1038
- DOMUtilsContext.off(element, eventNameList, null, handler, defaultOption);
1062
+ that.off(element, eventNameList, null, handler, defaultOption);
1039
1063
  },
1040
1064
  };
1041
1065
  }
@@ -1060,21 +1084,21 @@ export class DOMUtilsEvent {
1060
1084
  handler: (this: HTMLElement, event: DOMUtils_Event["keyup"]) => void,
1061
1085
  option?: boolean | DOMUtilsEventListenerOption
1062
1086
  ) {
1063
- const DOMUtilsContext = this;
1087
+ const that = this;
1064
1088
  if (element == null) {
1065
1089
  return;
1066
1090
  }
1067
1091
  if (typeof element === "string") {
1068
- element = DOMUtilsContext.selectorAll(element);
1092
+ element = that.selectorAll(element);
1069
1093
  }
1070
- if (DOMUtilsCommonUtils.isNodeList(element)) {
1094
+ if (CommonUtils.isNodeList(element)) {
1071
1095
  // 设置
1072
1096
  element.forEach(($ele) => {
1073
- DOMUtilsContext.keyup($ele as HTMLElement, handler, option);
1097
+ that.keyup($ele as HTMLElement, handler, option);
1074
1098
  });
1075
1099
  return;
1076
1100
  }
1077
- DOMUtilsContext.on(element, "keyup", null, handler, option);
1101
+ that.on(element, "keyup", null, handler, option);
1078
1102
  }
1079
1103
  /**
1080
1104
  * 当按键按下时触发事件
@@ -1096,21 +1120,21 @@ export class DOMUtilsEvent {
1096
1120
  handler: (this: HTMLElement, event: DOMUtils_Event["keydown"]) => void,
1097
1121
  option?: boolean | DOMUtilsEventListenerOption
1098
1122
  ) {
1099
- const DOMUtilsContext = this;
1123
+ const that = this;
1100
1124
  if (element == null) {
1101
1125
  return;
1102
1126
  }
1103
1127
  if (typeof element === "string") {
1104
- element = DOMUtilsContext.selectorAll(element);
1128
+ element = that.selectorAll(element);
1105
1129
  }
1106
- if (DOMUtilsCommonUtils.isNodeList(element)) {
1130
+ if (CommonUtils.isNodeList(element)) {
1107
1131
  // 设置
1108
1132
  element.forEach(($ele) => {
1109
- DOMUtilsContext.keydown($ele as HTMLElement, handler, option);
1133
+ that.keydown($ele as HTMLElement, handler, option);
1110
1134
  });
1111
1135
  return;
1112
1136
  }
1113
- DOMUtilsContext.on(element, "keydown", null, handler, option);
1137
+ that.on(element, "keydown", null, handler, option);
1114
1138
  }
1115
1139
  /**
1116
1140
  * 当按键按下时触发事件
@@ -1132,21 +1156,21 @@ export class DOMUtilsEvent {
1132
1156
  handler: (this: HTMLElement, event: DOMUtils_Event["keypress"]) => void,
1133
1157
  option?: boolean | DOMUtilsEventListenerOption
1134
1158
  ) {
1135
- const DOMUtilsContext = this;
1159
+ const that = this;
1136
1160
  if (element == null) {
1137
1161
  return;
1138
1162
  }
1139
1163
  if (typeof element === "string") {
1140
- element = DOMUtilsContext.selectorAll(element);
1164
+ element = that.selectorAll(element);
1141
1165
  }
1142
- if (DOMUtilsCommonUtils.isNodeList(element)) {
1166
+ if (CommonUtils.isNodeList(element)) {
1143
1167
  // 设置
1144
1168
  element.forEach(($ele) => {
1145
- DOMUtilsContext.keypress($ele as HTMLElement, handler, option);
1169
+ that.keypress($ele as HTMLElement, handler, option);
1146
1170
  });
1147
1171
  return;
1148
1172
  }
1149
- DOMUtilsContext.on(element, "keypress", null, handler, option);
1173
+ that.on(element, "keypress", null, handler, option);
1150
1174
  }
1151
1175
  /**
1152
1176
  * 监听某个元素键盘按键事件或window全局按键事件
@@ -1219,9 +1243,9 @@ export class DOMUtilsEvent {
1219
1243
  ): {
1220
1244
  removeListen(): void;
1221
1245
  } {
1222
- const DOMUtilsContext = this;
1246
+ const that = this;
1223
1247
  if (typeof element === "string") {
1224
- element = DOMUtilsContext.selectorAll(element);
1248
+ element = that.selectorAll(element);
1225
1249
  }
1226
1250
  const keyboardEventCallBack = function (event: KeyboardEvent) {
1227
1251
  /** 键名 */
@@ -1246,258 +1270,58 @@ export class DOMUtilsEvent {
1246
1270
  callback(keyName, keyValue, otherCodeList, event);
1247
1271
  }
1248
1272
  };
1249
- DOMUtilsContext.on(element, eventName, keyboardEventCallBack, options);
1273
+ that.on(element, eventName, keyboardEventCallBack, options);
1250
1274
  return {
1251
1275
  removeListen: () => {
1252
- DOMUtilsContext.off(element, eventName, keyboardEventCallBack, options);
1276
+ that.off(element, eventName, keyboardEventCallBack, options);
1253
1277
  },
1254
1278
  };
1255
1279
  }
1256
1280
  /**
1257
- * 选择器,可使用以下的额外语法
1258
- *
1259
- * + :contains([text]) 作用: 找到包含指定文本内容的指定元素
1260
- * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1261
- * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1262
- * @param selector 选择器
1263
- * @param parent 指定父元素
1264
- * @example
1265
- * DOMUtils.selector("div:contains('测试')")
1266
- * > div.xxx
1267
- * @example
1268
- * DOMUtils.selector("div:empty")
1269
- * > div.xxx
1270
- * @example
1271
- * DOMUtils.selector("div:regexp('^xxxx$')")
1272
- * > div.xxx
1273
- */
1274
- selector<K extends keyof HTMLElementTagNameMap>(
1275
- selector: K,
1276
- parent?: Element | Document | DocumentFragment | ShadowRoot
1277
- ): HTMLElementTagNameMap[K] | undefined;
1278
- selector<E extends Element = HTMLElement>(
1279
- selector: string,
1280
- parent?: Element | Document | DocumentFragment | ShadowRoot
1281
- ): E | undefined;
1282
- selector<E extends Element = HTMLElement>(
1283
- selector: string,
1284
- parent?: Element | Document | DocumentFragment | ShadowRoot
1285
- ) {
1286
- return this.selectorAll<E>(selector, parent)[0];
1287
- }
1288
- /**
1289
- * 选择器,可使用以下的额外语法
1290
- *
1291
- * + :contains([text]) 作用: 找到包含指定文本内容的指定元素
1292
- * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1293
- * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1294
- * @param selector 选择器
1295
- * @param parent 指定父元素
1296
- * @example
1297
- * DOMUtils.selectorAll("div:contains('测试')")
1298
- * > [div.xxx]
1281
+ * 阻止事件传递
1282
+ * @param event 要阻止传递的事件
1299
1283
  * @example
1300
- * DOMUtils.selectorAll("div:empty")
1301
- * > [div.xxx]
1302
- * @example
1303
- * DOMUtils.selectorAll("div:regexp('^xxxx$')")
1304
- * > [div.xxx]
1305
- * @example
1306
- * DOMUtils.selectorAll("div:regexp(/^xxx/ig)")
1307
- * > [div.xxx]
1284
+ * DOMUtils.preventEvent(event);
1308
1285
  */
1309
- selectorAll<K extends keyof HTMLElementTagNameMap>(
1310
- selector: K,
1311
- parent?: Element | Document | DocumentFragment | ShadowRoot
1312
- ): HTMLElementTagNameMap[K][];
1313
- selectorAll<E extends Element = HTMLElement>(
1314
- selector: string,
1315
- parent?: Element | Document | DocumentFragment | ShadowRoot
1316
- ): E[];
1317
- selectorAll<E extends Element = HTMLElement>(
1318
- selector: string,
1319
- parent?: Element | Document | DocumentFragment | ShadowRoot
1320
- ) {
1321
- const context = this;
1322
- parent = parent || context.windowApi.document;
1323
- selector = selector.trim();
1324
- if (selector.match(/[^\s]{1}:empty$/gi)) {
1325
- // empty 语法
1326
- selector = selector.replace(/:empty$/gi, "");
1327
- return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1328
- return $ele?.innerHTML?.trim() === "";
1329
- });
1330
- } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
1331
- // contains 语法
1332
- const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1333
- const text = textMatch![2];
1334
- selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1335
- return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1336
- // @ts-ignore
1337
- return ($ele?.textContent || $ele?.innerText)?.includes(text);
1338
- });
1339
- } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
1340
- // regexp 语法
1341
- const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1342
- let pattern = textMatch![2];
1343
- const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1344
- let flags = "";
1345
- if (flagMatch) {
1346
- pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1347
- flags = flagMatch[3];
1348
- }
1349
- const regexp = new RegExp(pattern, flags);
1350
- selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1351
- return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1352
- // @ts-ignore
1353
- return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
1354
- });
1355
- } else {
1356
- // 普通语法
1357
- return Array.from(parent.querySelectorAll<E>(selector));
1358
- }
1359
- }
1286
+ preventEvent(event: Event): boolean;
1360
1287
  /**
1361
- * 匹配元素,可使用以下的额外语法
1362
- *
1363
- * + :contains([text]) 作用: 找到包含指定文本内容的指定元素
1364
- * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1365
- * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1366
- * @param $el 元素
1367
- * @param selector 选择器
1288
+ * 通过监听事件来主动阻止事件的传递
1289
+ * @param $el 要进行处理的元素
1290
+ * @param eventNameList (可选)要阻止的事件名|列表
1291
+ * @param capture (可选)是否捕获,默认false
1368
1292
  * @example
1369
- * DOMUtils.matches("div:contains('测试')")
1370
- * > true
1371
- * @example
1372
- * DOMUtils.matches("div:empty")
1373
- * > true
1374
- * @example
1375
- * DOMUtils.matches("div:regexp('^xxxx$')")
1376
- * > true
1377
- * @example
1378
- * DOMUtils.matches("div:regexp(/^xxx/ig)")
1379
- * > false
1293
+ * DOMUtils.preventEvent(document.querySelector("a"),"click")
1380
1294
  */
1381
- matches($el: HTMLElement | Element | null | undefined, selector: string): boolean {
1382
- selector = selector.trim();
1383
- if ($el == null) {
1295
+ preventEvent($el: HTMLElement, eventNameList?: string | string[], capture?: boolean): void;
1296
+ preventEvent(...args: any[]) {
1297
+ /**
1298
+ * 阻止事件的默认行为发生,并阻止事件传播
1299
+ */
1300
+ const stopEvent = (event: Event) => {
1301
+ /* 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL */
1302
+ event?.preventDefault();
1303
+ /* 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素 */
1304
+ event?.stopPropagation();
1305
+ /* 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发 */
1306
+ event?.stopImmediatePropagation();
1384
1307
  return false;
1385
- }
1386
-
1387
- if (selector.match(/[^\s]{1}:empty$/gi)) {
1388
- // empty 语法
1389
- selector = selector.replace(/:empty$/gi, "");
1390
- return $el.matches(selector) && $el?.innerHTML?.trim() === "";
1391
- } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
1392
- // contains 语法
1393
- const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1394
- const text = textMatch![2];
1395
- selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1396
- // @ts-ignore
1397
- let content = $el?.textContent || $el?.innerText;
1398
- if (typeof content !== "string") {
1399
- content = "";
1400
- }
1401
- return $el.matches(selector) && content?.includes(text);
1402
- } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
1403
- // regexp 语法
1404
- const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1405
- let pattern = textMatch![2];
1406
- const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1407
- let flags = "";
1408
- if (flagMatch) {
1409
- pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1410
- flags = flagMatch[3];
1411
- }
1412
- const regexp = new RegExp(pattern, flags);
1413
- selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1414
- // @ts-ignore
1415
- let content = $el?.textContent || $el?.innerText;
1416
- if (typeof content !== "string") {
1417
- content = "";
1418
- }
1419
- return $el.matches(selector) && Boolean(content?.match(regexp));
1308
+ };
1309
+ if (args.length === 1) {
1310
+ /* 直接阻止事件 */
1311
+ return stopEvent(args[0]);
1420
1312
  } else {
1421
- // 普通语法
1422
- return $el.matches(selector);
1423
- }
1424
- }
1425
- /**
1426
- * 根据选择器获取上层元素,可使用以下的额外语法
1427
- *
1428
- * + :contains([text]) 作用: 找到包含指定文本内容的指定元素
1429
- * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1430
- * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1431
- * @param $el 元素
1432
- * @param selector 选择器
1433
- * @example
1434
- * DOMUtils.closest("div:contains('测试')")
1435
- * > div.xxx
1436
- * @example
1437
- * DOMUtils.closest("div:empty")
1438
- * > div.xxx
1439
- * @example
1440
- * DOMUtils.closest("div:regexp('^xxxx$')")
1441
- * > div.xxxx
1442
- * @example
1443
- * DOMUtils.closest("div:regexp(/^xxx/ig)")
1444
- * > null
1445
- */
1446
- closest<K extends keyof HTMLElementTagNameMap>(
1447
- $el: HTMLElement | Element,
1448
- selector: string
1449
- ): HTMLElementTagNameMap[K] | null;
1450
- closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null;
1451
- closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null {
1452
- selector = selector.trim();
1453
-
1454
- if (selector.match(/[^\s]{1}:empty$/gi)) {
1455
- // empty 语法
1456
- selector = selector.replace(/:empty$/gi, "");
1457
- const $closest = $el?.closest<E>(selector);
1458
- if ($closest && $closest?.innerHTML?.trim() === "") {
1459
- return $closest;
1460
- }
1461
- return null;
1462
- } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
1463
- // contains 语法
1464
- const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1465
- const text = textMatch![2];
1466
- selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1467
- const $closest = $el?.closest<E>(selector);
1468
- if ($closest) {
1469
- // @ts-ignore
1470
- const content = $el?.textContent || $el?.innerText;
1471
- if (typeof content === "string" && content.includes(text)) {
1472
- return $closest;
1473
- }
1313
+ const $el: HTMLElement = args[0];
1314
+ let eventNameList: string | string[] = args[1];
1315
+ const capture: boolean = args[2];
1316
+ /* 添加对应的事件来阻止触发 */
1317
+ if (typeof eventNameList === "string") {
1318
+ eventNameList = [eventNameList];
1474
1319
  }
1475
- return null;
1476
- } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
1477
- // regexp 语法
1478
- const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1479
- let pattern = textMatch![2];
1480
- const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1481
- let flags = "";
1482
- if (flagMatch) {
1483
- pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1484
- flags = flagMatch[3];
1485
- }
1486
- const regexp = new RegExp(pattern, flags);
1487
- selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1488
- const $closest = $el?.closest<E>(selector);
1489
- if ($closest) {
1490
- // @ts-ignore
1491
- const content = $el?.textContent || $el?.innerText;
1492
- if (typeof content === "string" && content.match(regexp)) {
1493
- return $closest;
1494
- }
1495
- }
1496
- return null;
1497
- } else {
1498
- // 普通语法
1499
- const $closest = $el?.closest<E>(selector);
1500
- return $closest;
1320
+ this.on($el, eventNameList, stopEvent, { capture: Boolean(capture) });
1501
1321
  }
1502
1322
  }
1503
1323
  }
1324
+
1325
+ const elementEvent = new ElementEvent();
1326
+
1327
+ export { elementEvent, ElementEvent };