@whitesev/domutils 1.7.0 → 1.7.2

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.
@@ -5,6 +5,7 @@ import { OriginPrototype } from "./OriginPrototype";
5
5
  import type {
6
6
  DOMUtils_Event,
7
7
  DOMUtils_EventType,
8
+ DOMUtilsAddEventListenerResult,
8
9
  DOMUtilsElementEventType,
9
10
  DOMUtilsEventListenerOption,
10
11
  DOMUtilsEventListenerOptionsAttribute,
@@ -50,7 +51,7 @@ class ElementEvent extends ElementAnimate {
50
51
  eventType: T | T[],
51
52
  callback: (this: HTMLElement, event: DOMUtils_Event[T]) => void,
52
53
  option?: DOMUtilsEventListenerOption | boolean
53
- ): void;
54
+ ): DOMUtilsAddEventListenerResult;
54
55
  /**
55
56
  * 绑定事件
56
57
  * @param element 需要绑定的元素|元素数组|window
@@ -74,7 +75,7 @@ class ElementEvent extends ElementAnimate {
74
75
  eventType: string | string[],
75
76
  callback: (this: HTMLElement, event: T) => void,
76
77
  option?: DOMUtilsEventListenerOption | boolean
77
- ): void;
78
+ ): DOMUtilsAddEventListenerResult;
78
79
  /**
79
80
  * 绑定事件
80
81
  * @param element 需要绑定的元素|元素数组|window
@@ -105,7 +106,7 @@ class ElementEvent extends ElementAnimate {
105
106
  selector: string | string[] | undefined | null,
106
107
  callback: (this: HTMLElement, event: DOMUtils_Event[T], selectorTarget: HTMLElement) => void,
107
108
  option?: DOMUtilsEventListenerOption | boolean
108
- ): void;
109
+ ): DOMUtilsAddEventListenerResult;
109
110
  /**
110
111
  * 绑定事件
111
112
  * @param element 需要绑定的元素|元素数组|window
@@ -136,7 +137,7 @@ class ElementEvent extends ElementAnimate {
136
137
  selector: string | string[] | undefined | null,
137
138
  callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void,
138
139
  option?: DOMUtilsEventListenerOption | boolean
139
- ): void;
140
+ ): DOMUtilsAddEventListenerResult;
140
141
  on<T extends Event>(
141
142
  element: HTMLElement | string | NodeList | HTMLElement[] | Window | Document | Element | null | typeof globalThis,
142
143
  eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
@@ -151,7 +152,7 @@ class ElementEvent extends ElementAnimate {
151
152
  | DOMUtilsEventListenerOption
152
153
  | boolean,
153
154
  option?: DOMUtilsEventListenerOption | boolean
154
- ) {
155
+ ): DOMUtilsAddEventListenerResult {
155
156
  /**
156
157
  * 获取option配置
157
158
  * @param args
@@ -190,30 +191,28 @@ class ElementEvent extends ElementAnimate {
190
191
  element = that.selectorAll(element);
191
192
  }
192
193
  if (element == null) {
193
- return;
194
+ return {
195
+ off() {},
196
+ trigger() {},
197
+ };
194
198
  }
195
- let elementList: HTMLElement[] = [];
199
+ let $elList: (Element | Document | Window)[] = [];
196
200
  if (element instanceof NodeList || Array.isArray(element)) {
197
- element = element as HTMLElement[];
198
- elementList = [...element];
201
+ $elList = $elList.concat(Array.from(element as Element[]));
199
202
  } else {
200
- elementList.push(element as HTMLElement);
203
+ $elList.push(element as Element);
201
204
  }
202
205
  // 事件名
203
206
  let eventTypeList: string[] = [];
204
207
  if (Array.isArray(eventType)) {
205
- eventTypeList = eventTypeList.concat(
206
- eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
207
- );
208
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
208
209
  } else if (typeof eventType === "string") {
209
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
210
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
210
211
  }
211
212
  // 子元素选择器
212
213
  let selectorList: string[] = [];
213
214
  if (Array.isArray(selector)) {
214
- selectorList = selectorList.concat(
215
- selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
216
- );
215
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
217
216
  } else if (typeof selector === "string") {
218
217
  selectorList.push(selector);
219
218
  }
@@ -243,7 +242,7 @@ class ElementEvent extends ElementAnimate {
243
242
  that.off(element, eventType as any, selector as any, callback as any, option);
244
243
  }
245
244
  }
246
- elementList.forEach((elementItem) => {
245
+ $elList.forEach((elementItem) => {
247
246
  /**
248
247
  * 事件回调
249
248
  * @param event
@@ -269,7 +268,7 @@ class ElementEvent extends ElementAnimate {
269
268
  }
270
269
  /* 在上层与主元素之间寻找可以被selector所匹配到的 */
271
270
  const $closestMatches = that.closest<HTMLElement>(eventTarget, selectorItem);
272
- if ($closestMatches && totalParent?.contains($closestMatches)) {
271
+ if ($closestMatches && (<HTMLElement>totalParent)?.contains?.($closestMatches)) {
273
272
  eventTarget = $closestMatches;
274
273
  return true;
275
274
  }
@@ -291,7 +290,7 @@ class ElementEvent extends ElementAnimate {
291
290
  }
292
291
  } else {
293
292
  // 这时候的this指向监听的元素
294
- listenerCallBack.call(elementItem, event as any);
293
+ listenerCallBack.call(elementItem as HTMLElement, event as any);
295
294
  checkOptionOnceToRemoveEventListener();
296
295
  }
297
296
  }
@@ -315,6 +314,30 @@ class ElementEvent extends ElementAnimate {
315
314
  Reflect.set(elementItem, GlobalData.domEventSymbol, elementEvents);
316
315
  });
317
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
+ };
318
341
  }
319
342
  /**
320
343
  * 取消绑定事件
@@ -467,24 +490,20 @@ class ElementEvent extends ElementAnimate {
467
490
  let $elList: HTMLElement[] = [];
468
491
  if (element instanceof NodeList || Array.isArray(element)) {
469
492
  element = element as HTMLElement[];
470
- $elList = [...element];
493
+ $elList = $elList.concat(Array.from(element));
471
494
  } else {
472
495
  $elList.push(element as HTMLElement);
473
496
  }
474
497
  let eventTypeList: string[] = [];
475
498
  if (Array.isArray(eventType)) {
476
- eventTypeList = eventTypeList.concat(
477
- eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
478
- );
499
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
479
500
  } else if (typeof eventType === "string") {
480
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
501
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
481
502
  }
482
503
  // 子元素选择器
483
504
  let selectorList: string[] = [];
484
505
  if (Array.isArray(selector)) {
485
- selectorList = selectorList.concat(
486
- selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
487
- );
506
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
488
507
  } else if (typeof selector === "string") {
489
508
  selectorList.push(selector);
490
509
  }
@@ -595,11 +614,11 @@ class ElementEvent extends ElementAnimate {
595
614
  if (element == null) {
596
615
  return;
597
616
  }
598
- let $elList: HTMLElement[] = [];
617
+ let $elList: (Element | Document | Window | typeof globalThis | Node | ChildNode | EventTarget)[] = [];
599
618
  if (element instanceof NodeList || Array.isArray(element)) {
600
- $elList = [...(element as HTMLElement[])];
619
+ $elList = $elList.concat(Array.from(element as HTMLElement[]));
601
620
  } else {
602
- $elList.push(element as HTMLElement);
621
+ $elList.push(element);
603
622
  }
604
623
 
605
624
  let eventTypeList: string[] = [];
@@ -706,7 +725,7 @@ class ElementEvent extends ElementAnimate {
706
725
  }
707
726
  if (checkDOMReadyState()) {
708
727
  /* 检查document状态 */
709
- CommonUtils.setTimeout(callback);
728
+ CommonUtils.setTimeout(callback, 0);
710
729
  } else {
711
730
  /* 添加监听 */
712
731
  addDomReadyListener();
@@ -717,7 +736,7 @@ class ElementEvent extends ElementAnimate {
717
736
  * @param element 需要触发的元素|元素数组|window
718
737
  * @param eventType 需要触发的事件
719
738
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
720
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
739
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
721
740
  * @example
722
741
  * // 触发元素a.xx的click事件
723
742
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -728,7 +747,7 @@ class ElementEvent extends ElementAnimate {
728
747
  */
729
748
  trigger(
730
749
  element: DOMUtilsTargetElementType | Element | DocumentFragment | any[] | typeof globalThis | Window | Document,
731
- eventType: string,
750
+ eventType: string | string[],
732
751
  details?: object,
733
752
  useDispatchToTriggerEvent?: boolean
734
753
  ): void;
@@ -737,7 +756,7 @@ class ElementEvent extends ElementAnimate {
737
756
  * @param element 需要触发的元素|元素数组|window
738
757
  * @param eventType 需要触发的事件
739
758
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
740
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认truefalse的话就直接触发获取使用DOMUtils进行监听的事件
759
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
741
760
  * @example
742
761
  * // 触发元素a.xx的click事件
743
762
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -747,7 +766,7 @@ class ElementEvent extends ElementAnimate {
747
766
  * DOMUtils.trigger("a.xx",["click","tap","hover"])
748
767
  */
749
768
  trigger(
750
- element: HTMLElement | string | NodeList | any[] | Window | Document,
769
+ element: Element | string | NodeList | any[] | Window | Document,
751
770
  eventType: DOMUtils_EventType | DOMUtils_EventType[],
752
771
  details?: object,
753
772
  useDispatchToTriggerEvent?: boolean
@@ -757,7 +776,7 @@ class ElementEvent extends ElementAnimate {
757
776
  * @param element 需要触发的元素|元素数组|window
758
777
  * @param eventType 需要触发的事件
759
778
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
760
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
779
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
761
780
  * @example
762
781
  * // 触发元素a.xx的click事件
763
782
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -767,8 +786,8 @@ class ElementEvent extends ElementAnimate {
767
786
  * DOMUtils.trigger("a.xx",["click","tap","hover"])
768
787
  */
769
788
  trigger(
770
- element: HTMLElement | string | NodeList | any[] | Window | Document,
771
- eventType: DOMUtils_EventType | DOMUtils_EventType[] | string,
789
+ element: Element | string | NodeList | any[] | Window | Document,
790
+ eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
772
791
  details?: object,
773
792
  useDispatchToTriggerEvent: boolean = true
774
793
  ) {
@@ -779,16 +798,15 @@ class ElementEvent extends ElementAnimate {
779
798
  if (element == null) {
780
799
  return;
781
800
  }
782
- let $elList = [];
801
+ let $elList: (Document | Window | Element)[] = [];
783
802
  if (element instanceof NodeList || Array.isArray(element)) {
784
- element = element as HTMLElement[];
785
- $elList = [...element];
803
+ $elList = $elList.concat(Array.from(element));
786
804
  } else {
787
- $elList = [element];
805
+ $elList.push(element);
788
806
  }
789
807
  let eventTypeList: string[] = [];
790
808
  if (Array.isArray(eventType)) {
791
- eventTypeList = eventType as string[];
809
+ eventTypeList = eventType.filter((it) => typeof it === "string" && it.trim() !== "");
792
810
  } else if (typeof eventType === "string") {
793
811
  eventTypeList = eventType.split(" ");
794
812
  }
@@ -798,24 +816,25 @@ class ElementEvent extends ElementAnimate {
798
816
  const elementEvents: {
799
817
  [key: string]: DOMUtilsEventListenerOptionsAttribute[];
800
818
  } = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
801
- eventTypeList.forEach((__eventType) => {
819
+ eventTypeList.forEach((eventTypeItem) => {
802
820
  let event: Event = null as any;
803
821
  if (details && details instanceof Event) {
804
822
  event = details;
805
823
  } else {
806
824
  // 构造事件
807
- event = new Event(__eventType);
825
+ event = new Event(eventTypeItem);
808
826
  if (details) {
809
- Object.keys(details).forEach((keyName) => {
827
+ const detailKeys = Object.keys(details);
828
+ detailKeys.forEach((keyName) => {
810
829
  const value = Reflect.get(details, keyName);
811
830
  // 在event上添加属性
812
831
  Reflect.set(event, keyName, value);
813
832
  });
814
833
  }
815
834
  }
816
- if (useDispatchToTriggerEvent == false && __eventType in elementEvents) {
835
+ if (useDispatchToTriggerEvent == false && eventTypeItem in elementEvents) {
817
836
  // 直接调用监听的事件
818
- elementEvents[__eventType].forEach((eventsItem: any) => {
837
+ elementEvents[eventTypeItem].forEach((eventsItem: any) => {
819
838
  eventsItem.callback(event);
820
839
  });
821
840
  } else {
@@ -249,3 +249,26 @@ export declare type DOMUtilsElementEventType =
249
249
  | ChildNode
250
250
  | Node
251
251
  | DocumentFragment;
252
+
253
+ /**
254
+ * 通过.on执行后的返回值
255
+ */
256
+ export declare interface DOMUtilsAddEventListenerResult {
257
+ /**
258
+ * 取消绑定的监听事件
259
+ * @param filter (可选)过滤函数,对元素属性上的事件进行过滤出想要删除的事件
260
+ */
261
+ off(
262
+ filter?: (
263
+ value: DOMUtilsEventListenerOptionsAttribute,
264
+ index: number,
265
+ array: DOMUtilsEventListenerOptionsAttribute[]
266
+ ) => boolean
267
+ ): void;
268
+ /**
269
+ * 主动触发事件
270
+ * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
271
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
272
+ */
273
+ trigger(details?: object, useDispatchToTriggerEvent?: boolean): void;
274
+ }