@whitesev/domutils 1.9.6 → 1.9.9

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@whitesev/domutils",
4
- "version": "1.9.6",
4
+ "version": "1.9.9",
5
5
  "description": "适合在浏览器中操作DOM的常用工具类",
6
6
  "keywords": [
7
7
  "typescript",
@@ -33,20 +33,20 @@
33
33
  },
34
34
  "devDependencies": {
35
35
  "@eslint/js": "^9.39.2",
36
- "@rollup/plugin-commonjs": "^29.0.0",
36
+ "@rollup/plugin-commonjs": "^29.0.1",
37
37
  "@rollup/plugin-json": "^6.1.0",
38
38
  "@rollup/plugin-node-resolve": "^16.0.3",
39
39
  "@rollup/plugin-terser": "^0.4.4",
40
40
  "@rollup/plugin-typescript": "^12.3.0",
41
41
  "browserslist": "^4.28.1",
42
- "caniuse-lite": "^1.0.30001770",
42
+ "caniuse-lite": "^1.0.30001776",
43
43
  "eslint": "^9.39.2",
44
44
  "eslint-config-prettier": "^10.1.8",
45
45
  "eslint-plugin-compat": "^6.0.2",
46
- "eslint-plugin-prettier": "^5.5.4",
46
+ "eslint-plugin-prettier": "^5.5.5",
47
47
  "globals": "^16.5.0",
48
- "oxfmt": "^0.32.0",
49
- "oxlint": "1.46.0",
48
+ "oxfmt": "^0.36.0",
49
+ "oxlint": "1.51.0",
50
50
  "rollup": "^4.54.0",
51
51
  "rollup-plugin-clear": "^2.0.7",
52
52
  "tslib": "^2.8.1",
@@ -533,15 +533,6 @@ class ElementEvent extends ElementAnimate {
533
533
  // 这是存在selector的情况
534
534
  listenerOption = getOption(args, 4, listenerOption);
535
535
  }
536
- // 是否移除所有事件
537
- let isRemoveAll = false;
538
- if (args.length === 2) {
539
- // 目标函数、事件名
540
- isRemoveAll = true;
541
- } else if ((args.length === 3 && typeof args[2] === "string") || Array.isArray(args[2])) {
542
- // 目标函数、事件名、子元素选择器
543
- isRemoveAll = true;
544
- }
545
536
  if (args.length === 5 && typeof args[4] === "function" && typeof filter !== "function") {
546
537
  // 目标函数、事件名、回调函数、事件配置、过滤函数
547
538
  filter = option as (
@@ -579,7 +570,7 @@ class ElementEvent extends ElementAnimate {
579
570
  // 事件的配置项不同
580
571
  flag = false;
581
572
  }
582
- if (flag || isRemoveAll) {
573
+ if (flag) {
583
574
  $elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
584
575
  const findIndex = handlers.findIndex((item) => item === handler);
585
576
  if (findIndex !== -1) {
@@ -830,20 +821,23 @@ class ElementEvent extends ElementAnimate {
830
821
  /**
831
822
  * 主动触发事件
832
823
  * @param element 需要触发的元素|元素数组|window
833
- * @param eventType 需要触发的事件
834
- * @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
835
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用通过.on监听的callback(),但是这种只有一个入参,如果使用$selector则没有值
824
+ * @param event 触发的事件
825
+ * @param extraDetails (可选)赋予触发的Event的额外属性
826
+ * @param useDispatchToTriggerEvent (可选)是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用通过.on监听的callback(),但是这种只有一个入参,如果使用$selector则没有值
836
827
  * @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"])
828
+ * DOMUtils.emit("a.xx", new Event("click"))
829
+ * @example
830
+ * DOMUtils.emit("a.xx", new Event("click"), {
831
+ * disableHook: true
832
+ * })
833
+ * @example
834
+ * DOMUtils.emit("a.xx", new Event("click"), {
835
+ * disableHook: true
836
+ * },false)
843
837
  */
844
838
  emit(
845
839
  element: Element | string | NodeList | any[] | Window | Document,
846
- eventType: DOMUtils_EventType | DOMUtils_EventType[],
840
+ event: Event,
847
841
  extraDetails?: object,
848
842
  useDispatchToTriggerEvent?: boolean
849
843
  ): void;
@@ -863,7 +857,7 @@ class ElementEvent extends ElementAnimate {
863
857
  */
864
858
  emit(
865
859
  element: Element | string | NodeList | any[] | Window | Document,
866
- eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
860
+ eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[] | Event,
867
861
  extraDetails?: object | boolean,
868
862
  useDispatchToTriggerEvent: boolean = true
869
863
  ) {
@@ -880,11 +874,33 @@ class ElementEvent extends ElementAnimate {
880
874
  } else {
881
875
  $elList.push(element);
882
876
  }
877
+
878
+ /**
879
+ * 主动添加属性
880
+ */
881
+ const addExtraProp = (event: Event, obj: any) => {
882
+ if (event instanceof Event && typeof obj === "object" && obj != null && !Array.isArray(obj)) {
883
+ const detailKeys = Object.keys(obj);
884
+ detailKeys.forEach((keyName) => {
885
+ const value = Reflect.get(obj, keyName);
886
+ // 在event上添加属性
887
+ Reflect.set(event, keyName, value);
888
+ });
889
+ }
890
+ };
891
+
883
892
  let eventTypeList: string[] = [];
893
+ /**
894
+ * 主动传递的事件
895
+ */
896
+ let __event__: Event | null = null;
884
897
  if (Array.isArray(eventType)) {
885
898
  eventTypeList = eventType.filter((it) => typeof it === "string" && it.trim() !== "");
886
899
  } else if (typeof eventType === "string") {
887
900
  eventTypeList = eventType.split(" ");
901
+ } else if (eventType instanceof Event) {
902
+ __event__ = eventType;
903
+ addExtraProp(__event__, extraDetails);
888
904
  }
889
905
 
890
906
  $elList.forEach(($elItem) => {
@@ -892,31 +908,34 @@ class ElementEvent extends ElementAnimate {
892
908
  const elementEvents: {
893
909
  [key: string]: DOMUtilsEventListenerOptionsAttribute[];
894
910
  } = 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
- }
911
+
912
+ /**
913
+ * 触发事件
914
+ */
915
+ const dispatchEvent = (event: Event, eventTypeItem: string) => {
911
916
  if (useDispatchToTriggerEvent == false && eventTypeItem in elementEvents) {
912
- // 直接调用监听的事件
917
+ // 直接调用.on监听的事件
913
918
  elementEvents[eventTypeItem].forEach((eventsItem) => {
914
919
  eventsItem.handlerCallBack(event);
915
920
  });
916
921
  } else {
917
922
  $elItem.dispatchEvent(event);
918
923
  }
919
- });
924
+ };
925
+
926
+ if (__event__) {
927
+ // 使用主动传递的事件直接触发
928
+ const event = __event__;
929
+ const eventTypeItem = event.type;
930
+ dispatchEvent(event, eventTypeItem);
931
+ } else {
932
+ eventTypeList.forEach((eventTypeItem) => {
933
+ // 构造事件
934
+ const event = new Event(eventTypeItem);
935
+ addExtraProp(event, extraDetails);
936
+ dispatchEvent(event, eventTypeItem);
937
+ });
938
+ }
920
939
  });
921
940
  }
922
941
 
@@ -1255,53 +1274,6 @@ class ElementEvent extends ElementAnimate {
1255
1274
  }
1256
1275
  return that.on(element, "keydown", null, handler, option);
1257
1276
  }
1258
- /**
1259
- * 当按键按下时触发事件
1260
- * keydown - > keypress - > keyup
1261
- * @param element 目标
1262
- * @param handler 事件处理函数
1263
- * @param option 配置
1264
- * @example
1265
- * // 监听a.xx元素的按键按下
1266
- * DOMUtils.keypress(document.querySelector("a.xx"),()=>{
1267
- * console.log("按键按下");
1268
- * })
1269
- * DOMUtils.keypress("a.xx",()=>{
1270
- * console.log("按键按下");
1271
- * })
1272
- */
1273
- onKeypress(
1274
- element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis,
1275
- handler: (this: HTMLElement, event: DOMUtils_Event["keypress"]) => void,
1276
- option?: boolean | DOMUtilsEventListenerOption
1277
- ) {
1278
- const that = this;
1279
- if (element == null) {
1280
- return;
1281
- }
1282
- if (typeof element === "string") {
1283
- element = that.selectorAll(element);
1284
- }
1285
- if (CommonUtils.isNodeList(element)) {
1286
- // 设置
1287
- const listenerList: (DOMUtilsAddEventListenerResult | undefined)[] = [];
1288
- element.forEach(($ele) => {
1289
- const listener = that.onKeypress($ele as HTMLElement, handler, option);
1290
- listenerList.push(listener);
1291
- });
1292
- return {
1293
- off() {
1294
- listenerList.forEach((listener) => {
1295
- if (!listener) {
1296
- return;
1297
- }
1298
- listener.off();
1299
- });
1300
- },
1301
- } as DOMUtilsAddEventListenerResult;
1302
- }
1303
- return that.on(element, "keypress", null, handler, option);
1304
- }
1305
1277
  /**
1306
1278
  * 监听某个元素键盘按键事件或window全局按键事件
1307
1279
  * 按下有值的键时触发,按下Ctrl\Alt\Shift\Meta是无值键。按下先触发keydown事件,再触发keypress事件。
@@ -1367,7 +1339,7 @@ class ElementEvent extends ElementAnimate {
1367
1339
  **/
1368
1340
  onKeyboard(
1369
1341
  element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis,
1370
- eventName: "keydown" | "keypress" | "keyup" = "keypress",
1342
+ eventName: "keydown" | "keyup" = "keydown",
1371
1343
  handler: (keyName: string, keyValue: number, otherCodeList: string[], event: KeyboardEvent) => void,
1372
1344
  options?: DOMUtilsEventListenerOption | boolean
1373
1345
  ): DOMUtilsAddEventListenerResult {
@@ -1687,7 +1659,9 @@ class ElementEvent extends ElementAnimate {
1687
1659
  onlyStopPropagation?: boolean;
1688
1660
  }
1689
1661
  | undefined = void 0;
1690
- if (typeof args[2] === "string" || Array.isArray(args[2])) {
1662
+ if (args.length === 2) {
1663
+ // ignore
1664
+ } else if (typeof args[2] === "string" || Array.isArray(args[2])) {
1691
1665
  // selector
1692
1666
  selector = args[2];
1693
1667
  if (typeof args[3] === "object" && args[3] != null) {
package/src/Utils.ts CHANGED
@@ -103,7 +103,6 @@ class Utils {
103
103
  "is",
104
104
  "jquery",
105
105
  "keydown",
106
- "keypress",
107
106
  "keyup",
108
107
  "last",
109
108
  "load",
@@ -47,7 +47,12 @@ export type DOMUtils_MouseEventType = keyof DOMUtils_MouseEvent;
47
47
  export interface DOMUtils_KeyboardEvent {
48
48
  /** 键盘按下事件 */
49
49
  keydown: KeyboardEvent;
50
- /** 键盘按压事件(字符键) */
50
+ /**
51
+ * 键盘按压事件(字符键)
52
+ *
53
+ * @link https://developer.mozilla.org/zh-CN/docs/Web/API/Element/keypress_event
54
+ * @deprecated
55
+ */
51
56
  keypress: KeyboardEvent;
52
57
  /** 键盘释放事件 */
53
58
  keyup: KeyboardEvent;