@whitesev/domutils 1.9.6 → 1.9.7

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.
@@ -830,20 +830,23 @@ class ElementEvent extends ElementAnimate {
830
830
  /**
831
831
  * 主动触发事件
832
832
  * @param element 需要触发的元素|元素数组|window
833
- * @param eventType 需要触发的事件
834
- * @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
835
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用通过.on监听的callback(),但是这种只有一个入参,如果使用$selector则没有值
833
+ * @param event 触发的事件
834
+ * @param extraDetails (可选)赋予触发的Event的额外属性
835
+ * @param useDispatchToTriggerEvent (可选)是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用通过.on监听的callback(),但是这种只有一个入参,如果使用$selector则没有值
836
836
  * @example
837
- * // 触发元素a.xxclick事件
838
- * DOMUtils.emit(document.querySelector("a.xx"),"click")
839
- * DOMUtils.emit("a.xx","click")
840
- * // 触发元素a.xx的click、tap、hover事件
841
- * DOMUtils.emit(document.querySelector("a.xx"),"click tap hover")
842
- * DOMUtils.emit("a.xx",["click","tap","hover"])
837
+ * DOMUtils.emit("a.xx", new Event("click"))
838
+ * @example
839
+ * DOMUtils.emit("a.xx", new Event("click"), {
840
+ * disableHook: true
841
+ * })
842
+ * @example
843
+ * DOMUtils.emit("a.xx", new Event("click"), {
844
+ * disableHook: true
845
+ * },false)
843
846
  */
844
847
  emit(
845
848
  element: Element | string | NodeList | any[] | Window | Document,
846
- eventType: DOMUtils_EventType | DOMUtils_EventType[],
849
+ event: Event,
847
850
  extraDetails?: object,
848
851
  useDispatchToTriggerEvent?: boolean
849
852
  ): void;
@@ -863,7 +866,7 @@ class ElementEvent extends ElementAnimate {
863
866
  */
864
867
  emit(
865
868
  element: Element | string | NodeList | any[] | Window | Document,
866
- eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
869
+ eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[] | Event,
867
870
  extraDetails?: object | boolean,
868
871
  useDispatchToTriggerEvent: boolean = true
869
872
  ) {
@@ -880,11 +883,33 @@ class ElementEvent extends ElementAnimate {
880
883
  } else {
881
884
  $elList.push(element);
882
885
  }
886
+
887
+ /**
888
+ * 主动添加属性
889
+ */
890
+ const addExtraProp = (event: Event, obj: any) => {
891
+ if (event instanceof Event && typeof obj === "object" && obj != null && !Array.isArray(obj)) {
892
+ const detailKeys = Object.keys(obj);
893
+ detailKeys.forEach((keyName) => {
894
+ const value = Reflect.get(obj, keyName);
895
+ // 在event上添加属性
896
+ Reflect.set(event, keyName, value);
897
+ });
898
+ }
899
+ };
900
+
883
901
  let eventTypeList: string[] = [];
902
+ /**
903
+ * 主动传递的事件
904
+ */
905
+ let __event__: Event | null = null;
884
906
  if (Array.isArray(eventType)) {
885
907
  eventTypeList = eventType.filter((it) => typeof it === "string" && it.trim() !== "");
886
908
  } else if (typeof eventType === "string") {
887
909
  eventTypeList = eventType.split(" ");
910
+ } else if (eventType instanceof Event) {
911
+ __event__ = eventType;
912
+ addExtraProp(__event__, extraDetails);
888
913
  }
889
914
 
890
915
  $elList.forEach(($elItem) => {
@@ -892,31 +917,34 @@ class ElementEvent extends ElementAnimate {
892
917
  const elementEvents: {
893
918
  [key: string]: DOMUtilsEventListenerOptionsAttribute[];
894
919
  } = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
895
- eventTypeList.forEach((eventTypeItem) => {
896
- let event: Event = null as any;
897
- if (extraDetails && extraDetails instanceof Event) {
898
- event = extraDetails;
899
- } else {
900
- // 构造事件
901
- event = new Event(eventTypeItem);
902
- if (typeof extraDetails === "object" && extraDetails != null) {
903
- const detailKeys = Object.keys(extraDetails);
904
- detailKeys.forEach((keyName) => {
905
- const value = Reflect.get(extraDetails, keyName);
906
- // 在event上添加属性
907
- Reflect.set(event, keyName, value);
908
- });
909
- }
910
- }
920
+
921
+ /**
922
+ * 触发事件
923
+ */
924
+ const dispatchEvent = (event: Event, eventTypeItem: string) => {
911
925
  if (useDispatchToTriggerEvent == false && eventTypeItem in elementEvents) {
912
- // 直接调用监听的事件
926
+ // 直接调用.on监听的事件
913
927
  elementEvents[eventTypeItem].forEach((eventsItem) => {
914
928
  eventsItem.handlerCallBack(event);
915
929
  });
916
930
  } else {
917
931
  $elItem.dispatchEvent(event);
918
932
  }
919
- });
933
+ };
934
+
935
+ if (__event__) {
936
+ // 使用主动传递的事件直接触发
937
+ const event = __event__;
938
+ const eventTypeItem = event.type;
939
+ dispatchEvent(event, eventTypeItem);
940
+ } else {
941
+ eventTypeList.forEach((eventTypeItem) => {
942
+ // 构造事件
943
+ const event = new Event(eventTypeItem);
944
+ addExtraProp(event, extraDetails);
945
+ dispatchEvent(event, eventTypeItem);
946
+ });
947
+ }
920
948
  });
921
949
  }
922
950