@whitesev/pops 4.2.0 → 4.2.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.
@@ -1,20 +1,20 @@
1
+ import { PopsCommonCSSClassName } from "../config/CommonCSSClassName";
2
+ import { OriginPrototype, PopsCore } from "../PopsCore";
1
3
  import type {
2
4
  ParseHTMLReturnType,
3
- PopsDOMUtils_EventType,
4
- PopsDOMUtilsCreateElementAttributesMap,
5
- PopsDOMUtilsEventListenerOption,
6
- PopsDOMUtilsEventListenerOptionsAttribute,
7
5
  PopsDOMUtils_Event,
8
- PopsDOMUtilsElementEventType,
6
+ PopsDOMUtils_EventType,
9
7
  PopsDOMUtilsAddEventListenerResult,
8
+ PopsDOMUtilsCreateElementAttributesMap,
10
9
  PopsDOMUtilsCSSProperty,
11
10
  PopsDOMUtilsCSSPropertyType,
11
+ PopsDOMUtilsElementEventType,
12
+ PopsDOMUtilsEventListenerOption,
13
+ PopsDOMUtilsEventListenerOptionsAttribute,
12
14
  PopsDOMUtilsTargetElementType,
13
15
  } from "../types/PopsDOMUtilsEventType";
14
- import { OriginPrototype, PopsCore } from "../PopsCore";
15
- import { popsUtils } from "./PopsUtils";
16
16
  import { PopsSafeUtils } from "./PopsSafeUtils";
17
- import { PopsCommonCSSClassName } from "../config/CommonCSSClassName";
17
+ import { popsUtils } from "./PopsUtils";
18
18
  /**
19
19
  * 存储在元素属性上的事件名
20
20
  */
@@ -39,7 +39,7 @@ class PopsDOMUtilsEvent {
39
39
  * console.log("事件触发",event)
40
40
  * })
41
41
  */
42
- on<T extends PopsDOMUtils_EventType>(
42
+ on<T extends PopsDOMUtils_EventType = PopsDOMUtils_EventType>(
43
43
  element: PopsDOMUtilsElementEventType,
44
44
  eventType: T | T[],
45
45
  callback: (this: HTMLElement, event: PopsDOMUtils_Event[T]) => void,
@@ -63,7 +63,7 @@ class PopsDOMUtilsEvent {
63
63
  * console.log("事件触发",event)
64
64
  * })
65
65
  */
66
- on<T extends Event>(
66
+ on<T extends Event = Event>(
67
67
  element: PopsDOMUtilsElementEventType,
68
68
  eventType: string | string[],
69
69
  callback: (this: HTMLElement, event: T) => void,
@@ -93,7 +93,7 @@ class PopsDOMUtilsEvent {
93
93
  * console.log("事件触发", event, selectorTarget)
94
94
  * })
95
95
  */
96
- on<T extends PopsDOMUtils_EventType>(
96
+ on<T extends PopsDOMUtils_EventType = PopsDOMUtils_EventType>(
97
97
  element: PopsDOMUtilsElementEventType,
98
98
  eventType: T | T[],
99
99
  selector: string | string[] | undefined | null,
@@ -124,24 +124,24 @@ class PopsDOMUtilsEvent {
124
124
  * console.log("事件触发", event, selectorTarget)
125
125
  * })
126
126
  */
127
- on<T extends Event>(
127
+ on<T extends Event = Event>(
128
128
  element: PopsDOMUtilsElementEventType,
129
129
  eventType: string | string[],
130
130
  selector: string | string[] | undefined | null,
131
131
  callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void,
132
132
  option?: PopsDOMUtilsEventListenerOption | boolean
133
133
  ): PopsDOMUtilsAddEventListenerResult;
134
- on<T extends Event>(
134
+ on<T extends Event = Event>(
135
135
  element: HTMLElement | string | NodeList | HTMLElement[] | Window | Document | Element | null | typeof globalThis,
136
136
  eventType: PopsDOMUtils_EventType | PopsDOMUtils_EventType[] | string | string[],
137
137
  selector:
138
138
  | string
139
139
  | string[]
140
140
  | undefined
141
- | ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void)
141
+ | (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
142
142
  | null,
143
143
  callback?:
144
- | ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void)
144
+ | (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
145
145
  | PopsDOMUtilsEventListenerOption
146
146
  | boolean,
147
147
  option?: PopsDOMUtilsEventListenerOption | boolean
@@ -152,7 +152,7 @@ class PopsDOMUtilsEvent {
152
152
  * @param startIndex
153
153
  * @param option
154
154
  */
155
- function getOption(args: IArguments, startIndex: number, option: PopsDOMUtilsEventListenerOption) {
155
+ const getOption = function (args: IArguments, startIndex: number, option: PopsDOMUtilsEventListenerOption) {
156
156
  const currentParam = args[startIndex];
157
157
  if (typeof currentParam === "boolean") {
158
158
  option.capture = currentParam;
@@ -175,7 +175,7 @@ class PopsDOMUtilsEvent {
175
175
  option.isComposedPath = currentParam.isComposedPath;
176
176
  }
177
177
  return option;
178
- }
178
+ };
179
179
 
180
180
  const that = this;
181
181
  // eslint-disable-next-line prefer-rest-params
@@ -189,33 +189,32 @@ class PopsDOMUtilsEvent {
189
189
  emit() {},
190
190
  };
191
191
  }
192
- let $elList: HTMLElement[] = [];
192
+ let $elList: (Element | Document | Window)[] = [];
193
193
  if (element instanceof NodeList || Array.isArray(element)) {
194
- element = element as HTMLElement[];
195
- $elList = [...element];
194
+ $elList = $elList.concat(Array.from(element as Element[]));
196
195
  } else {
197
- $elList.push(element as HTMLElement);
196
+ $elList.push(element as Element);
198
197
  }
199
198
  // 事件名
200
199
  let eventTypeList: string[] = [];
201
200
  if (Array.isArray(eventType)) {
202
- eventTypeList = eventTypeList.concat(
203
- eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
204
- );
201
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
205
202
  } else if (typeof eventType === "string") {
206
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
203
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
207
204
  }
208
205
  // 子元素选择器
209
206
  let selectorList: string[] = [];
210
207
  if (Array.isArray(selector)) {
211
- selectorList = selectorList.concat(
212
- selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
213
- );
208
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
214
209
  } else if (typeof selector === "string") {
215
210
  selectorList.push(selector);
216
211
  }
217
212
  // 事件回调
218
- let listenerCallBack: (this: HTMLElement, event: Event, selectorTarget?: HTMLElement) => void = callback as any;
213
+ let listenerCallBack: (this: Element, event: Event, $selector?: HTMLElement) => void | boolean = callback as (
214
+ this: Element,
215
+ event: Event,
216
+ $selector?: HTMLElement
217
+ ) => void | boolean;
219
218
  // 事件配置
220
219
  let listenerOption: PopsDOMUtilsEventListenerOption = {
221
220
  capture: false,
@@ -232,84 +231,104 @@ class PopsDOMUtilsEvent {
232
231
  // 这是存在selector的情况
233
232
  listenerOption = getOption(args, 4, listenerOption);
234
233
  }
235
- /**
236
- * 如果是once,那么删除该监听和元素上的事件和监听
237
- */
238
- function checkOptionOnceToRemoveEventListener() {
239
- if (listenerOption.once) {
240
- that.off(element, eventType as any, selector as any, callback as any, option);
241
- }
242
- }
243
- $elList.forEach((elementItem) => {
244
- /**
245
- * 事件回调
246
- * @param event
247
- */
248
- function domUtilsEventCallBack(event: Event) {
249
- if (selectorList.length) {
250
- // 存在子元素选择器
251
- // 这时候的this和target都是子元素选择器的元素
252
- let eventTarget = listenerOption.isComposedPath
253
- ? (event.composedPath()[0] as HTMLElement)
254
- : (event.target as HTMLElement);
255
- let totalParent = elementItem;
256
- if (popsUtils.isWin(totalParent)) {
257
- if (totalParent === (PopsCore.document as any as HTMLElement)) {
258
- totalParent = PopsCore.document.documentElement;
259
- }
234
+ $elList.forEach(($elItem) => {
235
+ // 遍历事件名设置元素事件
236
+ eventTypeList.forEach((eventName) => {
237
+ /**
238
+ * 如果是option.once,那么删除该监听和元素上的事件和监听
239
+ */
240
+ const checkOptionOnceToRemoveEventListener = () => {
241
+ if (listenerOption.once) {
242
+ this.off($elItem, eventName, selector as any, callback as any, option);
260
243
  }
261
- const findValue = selectorList.find((selectorItem) => {
262
- // 判断目标元素是否匹配选择器
263
- if (that.matches(eventTarget, selectorItem)) {
264
- // 当前目标可以被selector所匹配到
265
- return true;
244
+ };
245
+ /**
246
+ * 事件回调
247
+ * @param event
248
+ */
249
+ const handlerCallBack = function (event: Event) {
250
+ let call_this: Element | undefined = void 0;
251
+ let call_event: Event | undefined = void 0;
252
+ let call_$selector: HTMLElement | undefined = void 0;
253
+ let execCallback = false;
254
+ if (selectorList.length) {
255
+ // 存在子元素选择器
256
+ // 这时候的this和target都是子元素选择器的元素
257
+ let $target: HTMLElement;
258
+ if (listenerOption.isComposedPath) {
259
+ // 可能为空
260
+ const composedPath = event.composedPath();
261
+ if (!composedPath.length && event.target) {
262
+ composedPath.push(event.target);
263
+ }
264
+ $target = composedPath[0] as HTMLElement;
265
+ } else {
266
+ $target = event.target as HTMLElement;
266
267
  }
267
- // 在上层与主元素之间寻找可以被selector所匹配到的
268
- const $closestMatches = that.closest<HTMLElement>(eventTarget, selectorItem);
269
- if ($closestMatches && totalParent?.contains($closestMatches)) {
270
- eventTarget = $closestMatches;
271
- return true;
268
+ let $parent = $elItem;
269
+ if (popsUtils.isWin($parent)) {
270
+ // window和document共用一个对象
271
+ // 这样就能处理子元素选择器无法匹配的问题
272
+ $parent = PopsCore.document.documentElement;
272
273
  }
273
- return false;
274
- });
275
- if (findValue) {
276
- // 这里尝试使用defineProperty修改event的target值
277
- try {
278
- OriginPrototype.Object.defineProperty(event, "target", {
279
- get() {
280
- return eventTarget;
281
- },
282
- });
283
- } catch {
284
- // 忽略
274
+ const findValue = selectorList.find((selectors) => {
275
+ // 判断目标元素是否匹配选择器
276
+ if (that.matches($target, selectors)) {
277
+ // 当前目标可以被selector所匹配到
278
+ return true;
279
+ }
280
+ // 在上层与主元素之间寻找可以被selector所匹配到的
281
+ const $closestMatches = that.closest<HTMLElement>($target, selectors);
282
+ if ($closestMatches && (<HTMLElement>$parent)?.contains?.($closestMatches)) {
283
+ $target = $closestMatches;
284
+ return true;
285
+ }
286
+ return false;
287
+ });
288
+ if (findValue) {
289
+ // 这里尝试使用defineProperty修改event的target值
290
+ try {
291
+ OriginPrototype.Object.defineProperty(event, "target", {
292
+ get() {
293
+ return $target;
294
+ },
295
+ });
296
+ // oxlint-disable-next-line no-empty
297
+ } catch {}
298
+ execCallback = true;
299
+ call_this = $target;
300
+ call_event = event;
301
+ call_$selector = $target;
285
302
  }
286
- listenerCallBack.call(eventTarget, event as any, eventTarget);
303
+ } else {
304
+ execCallback = true;
305
+ call_this = $elItem as Element;
306
+ call_event = event;
307
+ }
308
+ if (execCallback) {
309
+ const result = listenerCallBack.call(call_this!, call_event!, call_$selector!);
287
310
  checkOptionOnceToRemoveEventListener();
311
+ if (typeof result === "boolean" && !result) {
312
+ return false;
313
+ }
288
314
  }
289
- } else {
290
- // 这时候的this指向监听的元素
291
- listenerCallBack.call(elementItem, event as any);
292
- checkOptionOnceToRemoveEventListener();
293
- }
294
- }
295
-
296
- // 遍历事件名设置元素事件
297
- eventTypeList.forEach((eventName) => {
298
- elementItem.addEventListener(eventName, domUtilsEventCallBack, listenerOption);
315
+ };
316
+ // add listener
317
+ $elItem.addEventListener(eventName, handlerCallBack, listenerOption);
299
318
  // 获取对象上的事件
300
319
  const elementEvents: {
301
320
  [k: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
302
- } = Reflect.get(elementItem, SymbolEvents) || {};
321
+ } = Reflect.get($elItem, SymbolEvents) || {};
303
322
  // 初始化对象上的xx事件
304
323
  elementEvents[eventName] = elementEvents[eventName] || [];
305
324
  elementEvents[eventName].push({
306
325
  selector: selectorList,
307
326
  option: listenerOption,
308
- callback: domUtilsEventCallBack,
309
- originCallBack: listenerCallBack,
327
+ handlerCallBack: handlerCallBack,
328
+ callback: listenerCallBack,
310
329
  });
311
330
  // 覆盖事件
312
- Reflect.set(elementItem, SymbolEvents, elementEvents);
331
+ Reflect.set($elItem, SymbolEvents, elementEvents);
313
332
  });
314
333
  });
315
334
 
@@ -329,11 +348,11 @@ class PopsDOMUtilsEvent {
329
348
  },
330
349
  /**
331
350
  * 主动触发事件
332
- * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
333
- * @param useDispatchToEmit 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
351
+ * @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
352
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了`$selector`的没有值
334
353
  */
335
- emit: (details?: object, useDispatchToEmit?: boolean) => {
336
- that.emit($elList, eventTypeList, details, useDispatchToEmit);
354
+ emit: (extraDetails?: object, useDispatchToTriggerEvent?: boolean) => {
355
+ that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
337
356
  },
338
357
  };
339
358
  }
@@ -350,10 +369,10 @@ class PopsDOMUtilsEvent {
350
369
  * DOMUtils.off(document.querySelector("a.xx"),"click")
351
370
  * DOMUtils.off("a.xx","click")
352
371
  */
353
- off<T extends PopsDOMUtils_EventType>(
372
+ off<T extends PopsDOMUtils_EventType = PopsDOMUtils_EventType>(
354
373
  element: PopsDOMUtilsElementEventType,
355
374
  eventType: T | T[],
356
- callback?: (this: HTMLElement, event: PopsDOMUtils_Event[T]) => void,
375
+ callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T]) => void,
357
376
  option?: EventListenerOptions | boolean,
358
377
  filter?: (
359
378
  value: PopsDOMUtilsEventListenerOptionsAttribute,
@@ -374,10 +393,10 @@ class PopsDOMUtilsEvent {
374
393
  * DOMUtils.off(document.querySelector("a.xx"),"click")
375
394
  * DOMUtils.off("a.xx","click")
376
395
  */
377
- off<T extends Event>(
396
+ off<T extends Event = Event>(
378
397
  element: PopsDOMUtilsElementEventType,
379
398
  eventType: string | string[],
380
- callback?: (this: HTMLElement, event: T) => void,
399
+ callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T) => void,
381
400
  option?: EventListenerOptions | boolean,
382
401
  filter?: (
383
402
  value: PopsDOMUtilsEventListenerOptionsAttribute,
@@ -399,11 +418,11 @@ class PopsDOMUtilsEvent {
399
418
  * DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
400
419
  * DOMUtils.off("a.xx",["click","tap","hover"])
401
420
  */
402
- off<T extends PopsDOMUtils_EventType>(
421
+ off<T extends PopsDOMUtils_EventType = PopsDOMUtils_EventType>(
403
422
  element: PopsDOMUtilsElementEventType,
404
423
  eventType: T | T[],
405
424
  selector?: string | string[] | undefined | null,
406
- callback?: (this: HTMLElement, event: PopsDOMUtils_Event[T], selectorTarget: HTMLElement) => void,
425
+ callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T], $selector: E) => void,
407
426
  option?: EventListenerOptions | boolean,
408
427
  filter?: (
409
428
  value: PopsDOMUtilsEventListenerOptionsAttribute,
@@ -425,11 +444,11 @@ class PopsDOMUtilsEvent {
425
444
  * DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
426
445
  * DOMUtils.off("a.xx",["click","tap","hover"])
427
446
  */
428
- off<T extends Event>(
447
+ off<T extends Event = Event>(
429
448
  element: PopsDOMUtilsElementEventType,
430
449
  eventType: string | string[],
431
450
  selector?: string | string[] | undefined | null,
432
- callback?: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void,
451
+ callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void,
433
452
  option?: EventListenerOptions | boolean,
434
453
  filter?: (
435
454
  value: PopsDOMUtilsEventListenerOptionsAttribute,
@@ -444,9 +463,12 @@ class PopsDOMUtilsEvent {
444
463
  | string
445
464
  | string[]
446
465
  | undefined
447
- | ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void)
466
+ | (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
448
467
  | null,
449
- callback?: ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void) | EventListenerOptions | boolean,
468
+ callback?:
469
+ | (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
470
+ | EventListenerOptions
471
+ | boolean,
450
472
  option?:
451
473
  | EventListenerOptions
452
474
  | boolean
@@ -467,7 +489,7 @@ class PopsDOMUtilsEvent {
467
489
  * @param startIndex
468
490
  * @param option
469
491
  */
470
- function getOption(args1: IArguments, startIndex: number, option: EventListenerOptions) {
492
+ const getOption = function (args1: IArguments, startIndex: number, option: EventListenerOptions) {
471
493
  const currentParam: EventListenerOptions | boolean = args1[startIndex];
472
494
  if (typeof currentParam === "boolean") {
473
495
  option.capture = currentParam;
@@ -475,12 +497,12 @@ class PopsDOMUtilsEvent {
475
497
  option.capture = currentParam.capture;
476
498
  }
477
499
  return option;
478
- }
479
- const DOMUtilsContext = this;
500
+ };
501
+ const that = this;
480
502
  // eslint-disable-next-line prefer-rest-params
481
503
  const args = arguments;
482
504
  if (typeof element === "string") {
483
- element = DOMUtilsContext.selectorAll(element);
505
+ element = that.selectorAll(element);
484
506
  }
485
507
  if (element == null) {
486
508
  return;
@@ -488,31 +510,27 @@ class PopsDOMUtilsEvent {
488
510
  let $elList: HTMLElement[] = [];
489
511
  if (element instanceof NodeList || Array.isArray(element)) {
490
512
  element = element as HTMLElement[];
491
- $elList = $elList.concat(element);
513
+ $elList = $elList.concat(Array.from(element));
492
514
  } else {
493
515
  $elList.push(element as HTMLElement);
494
516
  }
495
517
  let eventTypeList: string[] = [];
496
518
  if (Array.isArray(eventType)) {
497
- eventTypeList = eventTypeList.concat(
498
- eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
499
- );
519
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
500
520
  } else if (typeof eventType === "string") {
501
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
521
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
502
522
  }
503
523
  // 子元素选择器
504
524
  let selectorList: string[] = [];
505
525
  if (Array.isArray(selector)) {
506
- selectorList = selectorList.concat(
507
- selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
508
- );
526
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
509
527
  } else if (typeof selector === "string") {
510
528
  selectorList.push(selector);
511
529
  }
512
530
  /**
513
531
  * 事件的回调函数
514
532
  */
515
- let listenerCallBack: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void = callback as any;
533
+ let listenerCallBack: (this: HTMLElement, event: T, $selector: HTMLElement) => void = callback as any;
516
534
 
517
535
  /**
518
536
  * 事件的配置
@@ -537,24 +555,27 @@ class PopsDOMUtilsEvent {
537
555
  array: PopsDOMUtilsEventListenerOptionsAttribute[]
538
556
  ) => boolean;
539
557
  }
540
- $elList.forEach((elementItem) => {
558
+ $elList.forEach(($elItem) => {
541
559
  // 获取对象上的事件
542
560
  const elementEvents: {
543
561
  [key: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
544
- } = Reflect.get(elementItem, SymbolEvents) || {};
562
+ } = Reflect.get($elItem, SymbolEvents) || {};
545
563
  eventTypeList.forEach((eventName) => {
546
564
  const handlers = elementEvents[eventName] || [];
547
- const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
548
- for (let index = 0; index < filterHandler.length; index++) {
549
- const handler = filterHandler[index];
565
+ // 过滤出需要删除的事件
566
+ const handlersFiltered = typeof filter === "function" ? handlers.filter(filter) : handlers;
567
+ for (let index = 0; index < handlersFiltered.length; index++) {
568
+ const handler = handlersFiltered[index];
569
+ // 过滤出的事件再根据下面的条件进行判断处理移除
570
+ // 1. callback内存地址必须相同
571
+ // 2. selector必须相同
572
+ // 3. option.capture必须相同
550
573
  let flag = true;
551
- if (flag && listenerCallBack && handler.originCallBack !== listenerCallBack) {
552
- // callback不同
574
+ if (flag && listenerCallBack && handler.callback !== listenerCallBack) {
553
575
  flag = false;
554
576
  }
555
577
  if (flag && selectorList.length && Array.isArray(handler.selector)) {
556
578
  if (JSON.stringify(handler.selector) !== JSON.stringify(selectorList)) {
557
- // 子元素选择器不同
558
579
  flag = false;
559
580
  }
560
581
  }
@@ -563,14 +584,14 @@ class PopsDOMUtilsEvent {
563
584
  typeof handler.option.capture === "boolean" &&
564
585
  listenerOption.capture !== handler.option.capture
565
586
  ) {
566
- // 事件的配置项不同
567
587
  flag = false;
568
588
  }
569
589
  if (flag) {
570
- elementItem.removeEventListener(eventName, handler.callback, handler.option);
571
- const findIndex = handlers.findIndex((item) => item === handler);
572
- if (findIndex !== -1) {
573
- handlers.splice(findIndex, 1);
590
+ $elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
591
+ for (let i = handlers.length - 1; i >= 0; i--) {
592
+ if (handlers[i] === handler) {
593
+ handlers.splice(i, 1);
594
+ }
574
595
  }
575
596
  }
576
597
  }
@@ -579,7 +600,7 @@ class PopsDOMUtilsEvent {
579
600
  popsUtils.delete(elementEvents, eventType);
580
601
  }
581
602
  });
582
- Reflect.set(elementItem, SymbolEvents, elementEvents);
603
+ Reflect.set($elItem, SymbolEvents, elementEvents);
583
604
  });
584
605
  }
585
606
  /**
@@ -1080,7 +1101,7 @@ class PopsDOMUtilsEvent {
1080
1101
  * })
1081
1102
  */
1082
1103
  preventEvent(
1083
- $el: HTMLElement,
1104
+ $el: Element | Document | ShadowRoot,
1084
1105
  eventNameList: string | string[],
1085
1106
  option?: {
1086
1107
  /** (可选)是否捕获,默认false */
@@ -1111,7 +1132,7 @@ class PopsDOMUtilsEvent {
1111
1132
  * })
1112
1133
  */
1113
1134
  preventEvent(
1114
- $el: HTMLElement,
1135
+ $el: Element | Document | ShadowRoot,
1115
1136
  eventNameList: string | string[],
1116
1137
  selector: string | string[] | null | undefined,
1117
1138
  option?: {
@@ -1129,11 +1150,11 @@ class PopsDOMUtilsEvent {
1129
1150
  * 阻止事件的默认行为发生,并阻止事件传播
1130
1151
  */
1131
1152
  const stopEvent = (event: Event, onlyStopPropagation?: boolean) => {
1153
+ // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1154
+ event?.stopPropagation();
1155
+ // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1156
+ event?.stopImmediatePropagation();
1132
1157
  if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
1133
- // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1134
- event?.stopPropagation();
1135
- // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1136
- event?.stopImmediatePropagation();
1137
1158
  return;
1138
1159
  }
1139
1160
  // 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字