@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.
- package/dist/index.amd.js +126 -61
- package/dist/index.amd.js.map +1 -1
- package/dist/index.amd.min.js +1 -1
- package/dist/index.amd.min.js.map +1 -1
- package/dist/index.cjs.js +126 -61
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.cjs.min.js +1 -1
- package/dist/index.cjs.min.js.map +1 -1
- package/dist/index.esm.js +126 -61
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/index.iife.js +126 -61
- package/dist/index.iife.js.map +1 -1
- package/dist/index.iife.min.js +1 -1
- package/dist/index.iife.min.js.map +1 -1
- package/dist/index.system.js +126 -61
- package/dist/index.system.js.map +1 -1
- package/dist/index.system.min.js +1 -1
- package/dist/index.system.min.js.map +1 -1
- package/dist/index.umd.js +126 -61
- package/dist/index.umd.js.map +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/dist/types/src/ElementEvent.d.ts +70 -18
- package/package.json +1 -1
- package/src/ElementEvent.ts +210 -80
- package/src/Utils.ts +0 -3
|
@@ -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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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
|
|
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
|
|
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
package/src/ElementEvent.ts
CHANGED
|
@@ -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
|
|
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 =
|
|
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
|
-
|
|
1520
|
+
return (<DOMUtilsDoubleClickHandlerWithSelector>handler)(evt, $selector, option);
|
|
1476
1521
|
} else {
|
|
1477
|
-
|
|
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 && $
|
|
1534
|
+
if (isDoubleClick && clickMap.has($selector as Element)) {
|
|
1509
1535
|
isDoubleClick = false;
|
|
1510
|
-
$
|
|
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
|
-
$
|
|
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):
|
|
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
|
|
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
|
|
1634
|
+
* DOMUtils.preventEvent(document, "click", "a.xxx", {
|
|
1635
|
+
* capture: true,
|
|
1636
|
+
* onlyStopPropagation: true,
|
|
1637
|
+
* })
|
|
1560
1638
|
*/
|
|
1561
|
-
preventEvent(
|
|
1562
|
-
|
|
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
|
-
|
|
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
|
|
1576
|
-
|
|
1577
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|