@whitesev/domutils 1.9.4 → 1.9.6

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.
@@ -255,7 +255,7 @@ declare class ElementEvent extends ElementAnimate {
255
255
  * console.log("触发click事件成功")
256
256
  * })
257
257
  * */
258
- click(element: DOMUtilsTargetElementType | Element | DocumentFragment | typeof globalThis | Window, handler?: (this: HTMLElement, event: DOMUtils_Event["click"]) => void, details?: object, useDispatchToEmit?: boolean): void;
258
+ click(element: DOMUtilsTargetElementType | Element | DocumentFragment | typeof globalThis | Window, handler?: (this: HTMLElement, event: DOMUtils_Event["click"]) => void, details?: object, useDispatchToEmit?: boolean): DOMUtilsAddEventListenerResult | undefined;
259
259
  /**
260
260
  * 监听或触发元素的blur事件
261
261
  * @param element 目标元素
@@ -270,7 +270,7 @@ declare class ElementEvent extends ElementAnimate {
270
270
  * console.log("触发blur事件成功")
271
271
  * })
272
272
  * */
273
- blur(element: DOMUtilsTargetElementType | Element | DocumentFragment | typeof globalThis | Window, handler?: (this: HTMLElement, event: DOMUtils_Event["blur"]) => void, details?: object, useDispatchToEmit?: boolean): void;
273
+ blur(element: DOMUtilsTargetElementType | Element | DocumentFragment | typeof globalThis | Window, handler?: (this: HTMLElement, event: DOMUtils_Event["blur"]) => void, details?: object, useDispatchToEmit?: boolean): DOMUtilsAddEventListenerResult | undefined;
274
274
  /**
275
275
  * 监听或触发元素的focus事件
276
276
  * @param element 目标元素
@@ -285,7 +285,7 @@ declare class ElementEvent extends ElementAnimate {
285
285
  * console.log("触发focus事件成功")
286
286
  * })
287
287
  * */
288
- focus(element: DOMUtilsTargetElementType | Element | DocumentFragment | typeof globalThis | Window, handler?: (this: HTMLElement, event: DOMUtils_Event["focus"]) => void, details?: object, useDispatchToEmit?: boolean): void;
288
+ focus(element: DOMUtilsTargetElementType | Element | DocumentFragment | typeof globalThis | Window, handler?: (this: HTMLElement, event: DOMUtils_Event["focus"]) => void, details?: object, useDispatchToEmit?: boolean): DOMUtilsAddEventListenerResult | undefined;
289
289
  /**
290
290
  * 当鼠标移入或移出元素时触发事件
291
291
  * @param element 当前元素
@@ -300,7 +300,7 @@ declare class ElementEvent extends ElementAnimate {
300
300
  * console.log("移入/移除");
301
301
  * })
302
302
  */
303
- onHover(element: DOMUtilsTargetElementType | Element | DocumentFragment | Node, handler: (this: HTMLElement, event: DOMUtils_Event["hover"]) => void, option?: boolean | DOMUtilsEventListenerOption): void;
303
+ onHover(element: DOMUtilsTargetElementType | Element | DocumentFragment | Node, handler: (this: HTMLElement, event: DOMUtils_Event["hover"]) => void, option?: boolean | DOMUtilsEventListenerOption): DOMUtilsAddEventListenerResult | undefined;
304
304
  /**
305
305
  * 监听动画结束
306
306
  * @param element 监听的元素
@@ -334,7 +334,7 @@ declare class ElementEvent extends ElementAnimate {
334
334
  * console.log("按键松开");
335
335
  * })
336
336
  */
337
- onKeyup(element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis, handler: (this: HTMLElement, event: DOMUtils_Event["keyup"]) => void, option?: boolean | DOMUtilsEventListenerOption): void;
337
+ onKeyup(element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis, handler: (this: HTMLElement, event: DOMUtils_Event["keyup"]) => void, option?: boolean | DOMUtilsEventListenerOption): DOMUtilsAddEventListenerResult | undefined;
338
338
  /**
339
339
  * 当按键按下时触发事件
340
340
  * keydown - > keypress - > keyup
@@ -350,7 +350,7 @@ declare class ElementEvent extends ElementAnimate {
350
350
  * console.log("按键按下");
351
351
  * })
352
352
  */
353
- onKeydown(element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis, handler: (this: HTMLElement, event: DOMUtils_Event["keydown"]) => void, option?: boolean | DOMUtilsEventListenerOption): void;
353
+ onKeydown(element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis, handler: (this: HTMLElement, event: DOMUtils_Event["keydown"]) => void, option?: boolean | DOMUtilsEventListenerOption): DOMUtilsAddEventListenerResult | undefined;
354
354
  /**
355
355
  * 当按键按下时触发事件
356
356
  * keydown - > keypress - > keyup
@@ -366,7 +366,7 @@ declare class ElementEvent extends ElementAnimate {
366
366
  * console.log("按键按下");
367
367
  * })
368
368
  */
369
- onKeypress(element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis, handler: (this: HTMLElement, event: DOMUtils_Event["keypress"]) => void, option?: boolean | DOMUtilsEventListenerOption): void;
369
+ onKeypress(element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis, handler: (this: HTMLElement, event: DOMUtils_Event["keypress"]) => void, option?: boolean | DOMUtilsEventListenerOption): DOMUtilsAddEventListenerResult | undefined;
370
370
  /**
371
371
  * 监听某个元素键盘按键事件或window全局按键事件
372
372
  * 按下有值的键时触发,按下Ctrl\Alt\Shift\Meta是无值键。按下先触发keydown事件,再触发keypress事件。
@@ -430,18 +430,14 @@ declare class ElementEvent extends ElementAnimate {
430
430
  搜索 170
431
431
  收藏 171
432
432
  **/
433
- onKeyboard(element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis, eventName: "keydown" | "keypress" | "keyup" | undefined, handler: (keyName: string, keyValue: number, otherCodeList: string[], event: KeyboardEvent) => void, options?: DOMUtilsEventListenerOption | boolean): {
434
- removeListen(): void;
435
- };
433
+ onKeyboard(element: DOMUtilsTargetElementType | Element | DocumentFragment | Window | Node | typeof globalThis, eventName: "keydown" | "keypress" | "keyup" | undefined, handler: (keyName: string, keyValue: number, otherCodeList: string[], event: KeyboardEvent) => void, options?: DOMUtilsEventListenerOption | boolean): DOMUtilsAddEventListenerResult;
436
434
  /**
437
435
  * 监input、textarea的输入框值改变的事件(当输入法输入时,不会触发该监听)
438
436
  * @param $el 输入框元素
439
437
  * @param handler 回调函数
440
438
  * @param option 配置
441
439
  */
442
- onInput($el: HTMLInputElement | HTMLTextAreaElement, handler: (evt: InputEvent) => void | Promise<void>, option?: DOMUtilsEventListenerOption | boolean): {
443
- off: () => void;
444
- };
440
+ onInput($el: HTMLInputElement | HTMLTextAreaElement, handler: (evt: InputEvent) => void | Promise<void>, option?: DOMUtilsEventListenerOption | boolean): DOMUtilsAddEventListenerResult;
445
441
  /**
446
442
  * 双击监听,适配移动端
447
443
  * @param $el 监听的元素
@@ -463,20 +459,76 @@ declare class ElementEvent extends ElementAnimate {
463
459
  };
464
460
  /**
465
461
  * 阻止事件传递
462
+ *
463
+ * + `.preventDefault()`: 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
464
+ * + `.stopPropagation()`: 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
465
+ * + `.stopImmediatePropagation()`: 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
466
466
  * @param event 要阻止传递的事件
467
467
  * @example
468
468
  * DOMUtils.preventEvent(event);
469
469
  */
470
- preventEvent(event: Event): boolean;
470
+ preventEvent(event: Event): false;
471
+ /**
472
+ * 阻止事件传递
473
+ * @param event 要阻止传递的事件
474
+ * @param onlyStopPropagation (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()`
475
+ * @example
476
+ * DOMUtils.preventEvent(event, true);
477
+ */
478
+ preventEvent<T extends boolean>(event: Event, onlyStopPropagation: T): T extends true ? void : false;
471
479
  /**
472
480
  * 通过监听事件来主动阻止事件的传递
473
481
  * @param $el 要进行处理的元素
474
- * @param eventNameList (可选)要阻止的事件名|列表
475
- * @param capture (可选)是否捕获,默认false
482
+ * @param eventNameList 要阻止的事件名|列表
483
+ * @param option (可选)配置项
476
484
  * @example
477
- * DOMUtils.preventEvent(document.querySelector("a"),"click")
485
+ * DOMUtils.preventEvent(document.querySelector("a"), "click")
486
+ * @example
487
+ * DOMUtils.preventEvent(document.querySelector("a"), "click", undefined, {
488
+ * capture: true,
489
+ * })
490
+ * @example
491
+ * DOMUtils.preventEvent(document, "click", "a.xxx", {
492
+ * capture: true,
493
+ * onlyStopPropagation: true,
494
+ * })
478
495
  */
479
- preventEvent($el: HTMLElement, eventNameList?: string | string[], capture?: boolean): void;
496
+ preventEvent($el: HTMLElement, eventNameList: string | string[], option?: {
497
+ /** (可选)是否捕获,默认false */
498
+ capture?: boolean;
499
+ /** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
500
+ onlyStopPropagation?: boolean;
501
+ }): {
502
+ /** 移除监听事件 */
503
+ off(): void;
504
+ };
505
+ /**
506
+ * 通过监听事件来主动阻止事件的传递
507
+ * @param $el 要进行处理的元素
508
+ * @param eventNameList 要阻止的事件名|列表
509
+ * @param selector 子元素选择器
510
+ * @param option (可选)配置项
511
+ * @example
512
+ * DOMUtils.preventEvent(document.querySelector("a"), "click")
513
+ * @example
514
+ * DOMUtils.preventEvent(document.querySelector("a"), "click", undefined, {
515
+ * capture: true,
516
+ * })
517
+ * @example
518
+ * DOMUtils.preventEvent(document, "click", "a.xxx", {
519
+ * capture: true,
520
+ * onlyStopPropagation: true,
521
+ * })
522
+ */
523
+ preventEvent($el: HTMLElement, eventNameList: string | string[], selector: string | string[] | null | undefined, option?: {
524
+ /** (可选)是否捕获,默认false */
525
+ capture?: boolean;
526
+ /** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
527
+ onlyStopPropagation?: boolean;
528
+ }): {
529
+ /** 移除监听事件 */
530
+ off(): void;
531
+ };
480
532
  }
481
533
  declare const elementEvent: ElementEvent;
482
534
  export { elementEvent, ElementEvent };
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.4",
4
+ "version": "1.9.6",
5
5
  "description": "适合在浏览器中操作DOM的常用工具类",
6
6
  "keywords": [
7
7
  "typescript",
@@ -957,7 +957,8 @@ class ElementEvent extends ElementAnimate {
957
957
  if (handler == null) {
958
958
  that.emit(element, "click", details, useDispatchToEmit);
959
959
  } else {
960
- that.on(element, "click", null, handler);
960
+ const listener = that.on(element, "click", null, handler);
961
+ return listener;
961
962
  }
962
963
  }
963
964
  /**
@@ -997,7 +998,8 @@ class ElementEvent extends ElementAnimate {
997
998
  if (handler === null) {
998
999
  that.emit(element, "blur", details, useDispatchToEmit);
999
1000
  } else {
1000
- that.on(element, "blur", null, handler as (event: Event) => void);
1001
+ const listener = that.on(element, "blur", null, handler as (event: Event) => void);
1002
+ return listener;
1001
1003
  }
1002
1004
  }
1003
1005
  /**
@@ -1037,7 +1039,8 @@ class ElementEvent extends ElementAnimate {
1037
1039
  if (handler == null) {
1038
1040
  that.emit(element, "focus", details, useDispatchToEmit);
1039
1041
  } else {
1040
- that.on(element, "focus", null, handler);
1042
+ const listener = that.on(element, "focus", null, handler);
1043
+ return listener;
1041
1044
  }
1042
1045
  }
1043
1046
  /**
@@ -1068,13 +1071,31 @@ class ElementEvent extends ElementAnimate {
1068
1071
  }
1069
1072
  if (CommonUtils.isNodeList(element)) {
1070
1073
  // 设置
1074
+ const listenerList: (DOMUtilsAddEventListenerResult | undefined)[] = [];
1071
1075
  element.forEach(($ele) => {
1072
- that.onHover($ele as HTMLElement, handler, option);
1076
+ const listener = that.onHover($ele as HTMLElement, handler, option);
1077
+ listenerList.push(listener);
1073
1078
  });
1074
- return;
1079
+ return {
1080
+ off() {
1081
+ listenerList.forEach((listener) => {
1082
+ if (!listener) {
1083
+ return;
1084
+ }
1085
+ listener.off();
1086
+ });
1087
+ },
1088
+ } as DOMUtilsAddEventListenerResult;
1075
1089
  }
1076
- that.on(element, "mouseenter", null, handler, option);
1077
- that.on(element, "mouseleave", null, handler, option);
1090
+ const mouseenter_listener = that.on(element, "mouseenter", null, handler, option);
1091
+ const mouseleave_listener = that.on(element, "mouseleave", null, handler, option);
1092
+
1093
+ return {
1094
+ off() {
1095
+ mouseenter_listener.off();
1096
+ mouseleave_listener.off();
1097
+ },
1098
+ } as DOMUtilsAddEventListenerResult;
1078
1099
  }
1079
1100
  /**
1080
1101
  * 监听动画结束
@@ -1169,12 +1190,23 @@ class ElementEvent extends ElementAnimate {
1169
1190
  }
1170
1191
  if (CommonUtils.isNodeList(element)) {
1171
1192
  // 设置
1193
+ const listenerList: (DOMUtilsAddEventListenerResult | undefined)[] = [];
1172
1194
  element.forEach(($ele) => {
1173
- that.onKeyup($ele as HTMLElement, handler, option);
1195
+ const listener = that.onKeyup($ele as HTMLElement, handler, option);
1196
+ listenerList.push(listener);
1174
1197
  });
1175
- return;
1198
+ return {
1199
+ off() {
1200
+ listenerList.forEach((listener) => {
1201
+ if (!listener) {
1202
+ return;
1203
+ }
1204
+ listener.off();
1205
+ });
1206
+ },
1207
+ } as DOMUtilsAddEventListenerResult;
1176
1208
  }
1177
- that.on(element, "keyup", null, handler, option);
1209
+ return that.on(element, "keyup", null, handler, option);
1178
1210
  }
1179
1211
  /**
1180
1212
  * 当按键按下时触发事件
@@ -1205,12 +1237,23 @@ class ElementEvent extends ElementAnimate {
1205
1237
  }
1206
1238
  if (CommonUtils.isNodeList(element)) {
1207
1239
  // 设置
1240
+ const listenerList: (DOMUtilsAddEventListenerResult | undefined)[] = [];
1208
1241
  element.forEach(($ele) => {
1209
- that.onKeydown($ele as HTMLElement, handler, option);
1242
+ const listener = that.onKeydown($ele as HTMLElement, handler, option);
1243
+ listenerList.push(listener);
1210
1244
  });
1211
- return;
1245
+ return {
1246
+ off() {
1247
+ listenerList.forEach((listener) => {
1248
+ if (!listener) {
1249
+ return;
1250
+ }
1251
+ listener.off();
1252
+ });
1253
+ },
1254
+ } as DOMUtilsAddEventListenerResult;
1212
1255
  }
1213
- that.on(element, "keydown", null, handler, option);
1256
+ return that.on(element, "keydown", null, handler, option);
1214
1257
  }
1215
1258
  /**
1216
1259
  * 当按键按下时触发事件
@@ -1241,12 +1284,23 @@ class ElementEvent extends ElementAnimate {
1241
1284
  }
1242
1285
  if (CommonUtils.isNodeList(element)) {
1243
1286
  // 设置
1287
+ const listenerList: (DOMUtilsAddEventListenerResult | undefined)[] = [];
1244
1288
  element.forEach(($ele) => {
1245
- that.onKeypress($ele as HTMLElement, handler, option);
1289
+ const listener = that.onKeypress($ele as HTMLElement, handler, option);
1290
+ listenerList.push(listener);
1246
1291
  });
1247
- return;
1292
+ return {
1293
+ off() {
1294
+ listenerList.forEach((listener) => {
1295
+ if (!listener) {
1296
+ return;
1297
+ }
1298
+ listener.off();
1299
+ });
1300
+ },
1301
+ } as DOMUtilsAddEventListenerResult;
1248
1302
  }
1249
- that.on(element, "keypress", null, handler, option);
1303
+ return that.on(element, "keypress", null, handler, option);
1250
1304
  }
1251
1305
  /**
1252
1306
  * 监听某个元素键盘按键事件或window全局按键事件
@@ -1316,9 +1370,7 @@ class ElementEvent extends ElementAnimate {
1316
1370
  eventName: "keydown" | "keypress" | "keyup" = "keypress",
1317
1371
  handler: (keyName: string, keyValue: number, otherCodeList: string[], event: KeyboardEvent) => void,
1318
1372
  options?: DOMUtilsEventListenerOption | boolean
1319
- ): {
1320
- removeListen(): void;
1321
- } {
1373
+ ): DOMUtilsAddEventListenerResult {
1322
1374
  const that = this;
1323
1375
  if (typeof element === "string") {
1324
1376
  element = that.selectorAll(element);
@@ -1346,12 +1398,8 @@ class ElementEvent extends ElementAnimate {
1346
1398
  handler(keyName, keyValue, otherCodeList, event);
1347
1399
  }
1348
1400
  };
1349
- that.on(element, eventName, keyboardEventCallBack, options);
1350
- return {
1351
- removeListen: () => {
1352
- that.off(element, eventName, keyboardEventCallBack, options);
1353
- },
1354
- };
1401
+ const listener = that.on(element, eventName, keyboardEventCallBack, options);
1402
+ return listener;
1355
1403
  }
1356
1404
  /**
1357
1405
  * 监input、textarea的输入框值改变的事件(当输入法输入时,不会触发该监听)
@@ -1363,7 +1411,7 @@ class ElementEvent extends ElementAnimate {
1363
1411
  $el: HTMLInputElement | HTMLTextAreaElement,
1364
1412
  handler: (evt: InputEvent) => void | Promise<void>,
1365
1413
  option?: DOMUtilsEventListenerOption | boolean
1366
- ) {
1414
+ ): DOMUtilsAddEventListenerResult {
1367
1415
  /**
1368
1416
  * 是否正在输入中
1369
1417
  */
@@ -1386,11 +1434,14 @@ class ElementEvent extends ElementAnimate {
1386
1434
  const compositionEndListener = this.on($el, "compositionend", __composition_end_callback, option);
1387
1435
 
1388
1436
  return {
1389
- off: () => {
1437
+ off() {
1390
1438
  inputListener.off();
1391
1439
  compositionStartListener.off();
1392
1440
  compositionEndListener.off();
1393
1441
  },
1442
+ emit(details?, useDispatchToEmit?) {
1443
+ inputListener.emit(details, useDispatchToEmit);
1444
+ },
1394
1445
  };
1395
1446
  }
1396
1447
  /**
@@ -1454,60 +1505,35 @@ class ElementEvent extends ElementAnimate {
1454
1505
  throw new Error("args length error");
1455
1506
  }
1456
1507
 
1457
- let $click: Element | null = null;
1508
+ let clickMap = new WeakMap<Element, PointerEvent>();
1458
1509
  let isDoubleClick = false;
1459
1510
  let timer: number | undefined = void 0;
1460
- /** 是否是移动端点击 */
1461
- let isMobileTouch = false;
1462
1511
  /** 检测是否是单击的延迟时间 */
1463
1512
  const checkClickTime = 200;
1464
1513
 
1465
- const dblclick_handler = async (
1514
+ const dblclick_handler = (
1466
1515
  evt: MouseEvent | PointerEvent | TouchEvent,
1467
1516
  option: DOMUtilsDoubleClickOption,
1468
1517
  $selector?: HTMLElement
1469
1518
  ) => {
1470
- if (evt.type === "dblclick" && isMobileTouch) {
1471
- // 禁止在移动端触发dblclick事件
1472
- return;
1473
- }
1474
1519
  if ($selector) {
1475
- await (<DOMUtilsDoubleClickHandlerWithSelector>handler)(evt, $selector, option);
1520
+ return (<DOMUtilsDoubleClickHandlerWithSelector>handler)(evt, $selector, option);
1476
1521
  } else {
1477
- await (<DOMUtilsDoubleClickHandler>handler)(evt, option);
1522
+ return (<DOMUtilsDoubleClickHandler>handler)(evt, option);
1478
1523
  }
1479
1524
  };
1480
1525
 
1481
- const dblClickListener = this.on(
1482
- $el,
1483
- "dblclick",
1484
- selector,
1485
- (evt, $selector) => {
1486
- this.preventEvent(evt);
1487
- dblclick_handler(
1488
- evt,
1489
- {
1490
- isDoubleClick: true,
1491
- },
1492
- $selector
1493
- );
1494
- },
1495
- options
1496
- );
1497
1526
  const pointerUpListener = this.on(
1498
1527
  $el,
1499
1528
  "pointerup",
1500
1529
  selector,
1501
1530
  (evt, $selector) => {
1502
- this.preventEvent(evt);
1503
- if (evt.pointerType === "touch") {
1504
- isMobileTouch = true;
1505
- }
1531
+ // this.preventEvent(evt);
1506
1532
  clearTimeout(timer);
1507
1533
  timer = void 0;
1508
- if (isDoubleClick && $click === $selector) {
1534
+ if (isDoubleClick && clickMap.has($selector as Element)) {
1509
1535
  isDoubleClick = false;
1510
- $click = null;
1536
+ clickMap.delete($selector);
1511
1537
  /* 判定为双击 */
1512
1538
  dblclick_handler(
1513
1539
  evt,
@@ -1529,7 +1555,7 @@ class ElementEvent extends ElementAnimate {
1529
1555
  );
1530
1556
  }, checkClickTime);
1531
1557
  isDoubleClick = true;
1532
- $click = $selector;
1558
+ clickMap.set($selector as Element, evt);
1533
1559
  }
1534
1560
  },
1535
1561
  options
@@ -1537,53 +1563,157 @@ class ElementEvent extends ElementAnimate {
1537
1563
 
1538
1564
  return {
1539
1565
  off() {
1540
- $click = null;
1541
- dblClickListener.off();
1542
1566
  pointerUpListener.off();
1567
+ // @ts-expect-error
1568
+ clickMap = null;
1543
1569
  },
1544
1570
  };
1545
1571
  }
1546
1572
  /**
1547
1573
  * 阻止事件传递
1574
+ *
1575
+ * + `.preventDefault()`: 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
1576
+ * + `.stopPropagation()`: 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1577
+ * + `.stopImmediatePropagation()`: 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1548
1578
  * @param event 要阻止传递的事件
1549
1579
  * @example
1550
1580
  * DOMUtils.preventEvent(event);
1551
1581
  */
1552
- preventEvent(event: Event): boolean;
1582
+ preventEvent(event: Event): false;
1583
+ /**
1584
+ * 阻止事件传递
1585
+ * @param event 要阻止传递的事件
1586
+ * @param onlyStopPropagation (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()`
1587
+ * @example
1588
+ * DOMUtils.preventEvent(event, true);
1589
+ */
1590
+ preventEvent<T extends boolean>(event: Event, onlyStopPropagation: T): T extends true ? void : false;
1591
+ /**
1592
+ * 通过监听事件来主动阻止事件的传递
1593
+ * @param $el 要进行处理的元素
1594
+ * @param eventNameList 要阻止的事件名|列表
1595
+ * @param option (可选)配置项
1596
+ * @example
1597
+ * DOMUtils.preventEvent(document.querySelector("a"), "click")
1598
+ * @example
1599
+ * DOMUtils.preventEvent(document.querySelector("a"), "click", undefined, {
1600
+ * capture: true,
1601
+ * })
1602
+ * @example
1603
+ * DOMUtils.preventEvent(document, "click", "a.xxx", {
1604
+ * capture: true,
1605
+ * onlyStopPropagation: true,
1606
+ * })
1607
+ */
1608
+ preventEvent(
1609
+ $el: HTMLElement,
1610
+ eventNameList: string | string[],
1611
+ option?: {
1612
+ /** (可选)是否捕获,默认false */
1613
+ capture?: boolean;
1614
+ /** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
1615
+ onlyStopPropagation?: boolean;
1616
+ }
1617
+ ): {
1618
+ /** 移除监听事件 */
1619
+ off(): void;
1620
+ };
1553
1621
  /**
1554
1622
  * 通过监听事件来主动阻止事件的传递
1555
1623
  * @param $el 要进行处理的元素
1556
- * @param eventNameList (可选)要阻止的事件名|列表
1557
- * @param capture (可选)是否捕获,默认false
1624
+ * @param eventNameList 要阻止的事件名|列表
1625
+ * @param selector 子元素选择器
1626
+ * @param option (可选)配置项
1627
+ * @example
1628
+ * DOMUtils.preventEvent(document.querySelector("a"), "click")
1629
+ * @example
1630
+ * DOMUtils.preventEvent(document.querySelector("a"), "click", undefined, {
1631
+ * capture: true,
1632
+ * })
1558
1633
  * @example
1559
- * DOMUtils.preventEvent(document.querySelector("a"),"click")
1634
+ * DOMUtils.preventEvent(document, "click", "a.xxx", {
1635
+ * capture: true,
1636
+ * onlyStopPropagation: true,
1637
+ * })
1560
1638
  */
1561
- preventEvent($el: HTMLElement, eventNameList?: string | string[], capture?: boolean): void;
1562
- preventEvent(...args: any[]) {
1639
+ preventEvent(
1640
+ $el: HTMLElement,
1641
+ eventNameList: string | string[],
1642
+ selector: string | string[] | null | undefined,
1643
+ option?: {
1644
+ /** (可选)是否捕获,默认false */
1645
+ capture?: boolean;
1646
+ /** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
1647
+ onlyStopPropagation?: boolean;
1648
+ }
1649
+ ): {
1650
+ /** 移除监听事件 */
1651
+ off(): void;
1652
+ };
1653
+ preventEvent(...args: any[]): boolean | void | { off(): void } {
1563
1654
  /**
1564
1655
  * 阻止事件的默认行为发生,并阻止事件传播
1565
1656
  */
1566
- const stopEvent = (event: Event) => {
1567
- /* 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL */
1657
+ const stopEvent = (event: Event, onlyStopPropagation?: boolean) => {
1658
+ if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
1659
+ // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1660
+ event?.stopPropagation();
1661
+ // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1662
+ event?.stopImmediatePropagation();
1663
+ return;
1664
+ }
1665
+ // 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
1568
1666
  event?.preventDefault();
1569
- /* 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素 */
1570
- event?.stopPropagation();
1571
- /* 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发 */
1572
- event?.stopImmediatePropagation();
1573
1667
  return false;
1574
1668
  };
1575
- if (args.length === 1) {
1576
- /* 直接阻止事件 */
1577
- return stopEvent(args[0]);
1669
+ if (args[0] instanceof Event) {
1670
+ // 直接阻止事件
1671
+ const onlyStopPropagation: boolean = args[1];
1672
+ return stopEvent(args[0], onlyStopPropagation);
1578
1673
  } else {
1579
1674
  const $el: HTMLElement = args[0];
1580
1675
  let eventNameList: string | string[] = args[1];
1581
- const capture: boolean = args[2];
1582
- /* 添加对应的事件来阻止触发 */
1676
+ let selector: string | string[] | null | undefined = void 0;
1677
+ let capture = false;
1678
+ let onlyStopPropagation = false;
1679
+ // 添加对应的事件来阻止触发
1583
1680
  if (typeof eventNameList === "string") {
1584
1681
  eventNameList = [eventNameList];
1585
1682
  }
1586
- this.on($el, eventNameList, stopEvent, { capture: Boolean(capture) });
1683
+
1684
+ let option:
1685
+ | {
1686
+ capture?: boolean;
1687
+ onlyStopPropagation?: boolean;
1688
+ }
1689
+ | undefined = void 0;
1690
+ if (typeof args[2] === "string" || Array.isArray(args[2])) {
1691
+ // selector
1692
+ selector = args[2];
1693
+ if (typeof args[3] === "object" && args[3] != null) {
1694
+ option = args[3];
1695
+ }
1696
+ } else if (typeof args[2] === "object" && args[2] != null && !Array.isArray(args[2])) {
1697
+ // option
1698
+ option = args[2];
1699
+ } else {
1700
+ throw new TypeError("Invalid argument");
1701
+ }
1702
+ if (option) {
1703
+ capture = Boolean(option.capture);
1704
+ onlyStopPropagation = Boolean(option.onlyStopPropagation);
1705
+ }
1706
+
1707
+ const listener = this.on(
1708
+ $el,
1709
+ eventNameList,
1710
+ selector,
1711
+ (evt) => {
1712
+ return stopEvent(evt, onlyStopPropagation);
1713
+ },
1714
+ { capture: capture }
1715
+ );
1716
+ return listener;
1587
1717
  }
1588
1718
  }
1589
1719
  }
package/src/Utils.ts CHANGED
@@ -156,10 +156,7 @@ class Utils {
156
156
  "slideDown",
157
157
  "slideToggle",
158
158
  "slideUp",
159
- "sort",
160
- "splice",
161
159
  "text",
162
- "toArray",
163
160
  "toggle",
164
161
  "toggleClass",
165
162
  "trigger",