@whitesev/pops 4.2.0 → 4.2.1

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.
@@ -185,10 +185,10 @@ declare class Pops {
185
185
  on<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], callback: (this: HTMLElement, event: T) => void, option?: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOption | boolean): import("./types/PopsDOMUtilsEventType").PopsDOMUtilsAddEventListenerResult;
186
186
  on<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], selector: string | string[] | undefined | null, callback: (this: HTMLElement, event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event[T], selectorTarget: HTMLElement) => void, option?: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOption | boolean): import("./types/PopsDOMUtilsEventType").PopsDOMUtilsAddEventListenerResult;
187
187
  on<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], selector: string | string[] | undefined | null, callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void, option?: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOption | boolean): import("./types/PopsDOMUtilsEventType").PopsDOMUtilsAddEventListenerResult;
188
- off<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], callback?: ((this: HTMLElement, event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event[T]) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
189
- off<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], callback?: ((this: HTMLElement, event: T) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
190
- off<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: ((this: HTMLElement, event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event[T], selectorTarget: HTMLElement) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
191
- off<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
188
+ off<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], callback?: (<E extends HTMLElement = HTMLElement>(this: E, event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event[T]) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
189
+ off<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], callback?: (<E extends HTMLElement = HTMLElement>(this: E, event: T) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
190
+ off<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: (<E extends HTMLElement = HTMLElement>(this: E, event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event[T], $selector: E) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
191
+ off<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
192
192
  offAll(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType?: string): void;
193
193
  offAll(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType?: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType | import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType[]): void;
194
194
  onReady<T extends (...args: any[]) => any>(callback: T): void;
@@ -202,13 +202,13 @@ declare class Pops {
202
202
  onKeydown(target: HTMLElement | Window | typeof globalThis | string, handler: (event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event["keydown"]) => void, option?: boolean | AddEventListenerOptions): import("./types/PopsDOMUtilsEventType").PopsDOMUtilsAddEventListenerResult | undefined;
203
203
  preventEvent(event: Event): false;
204
204
  preventEvent<T extends boolean>(event: Event, onlyStopPropagation: T): T extends true ? void : false;
205
- preventEvent($el: HTMLElement, eventNameList: string | string[], option?: {
205
+ preventEvent($el: Element | Document | ShadowRoot, eventNameList: string | string[], option?: {
206
206
  capture?: boolean;
207
207
  onlyStopPropagation?: boolean;
208
208
  }): {
209
209
  off(): void;
210
210
  };
211
- preventEvent($el: HTMLElement, eventNameList: string | string[], selector: string | string[] | null | undefined, option?: {
211
+ preventEvent($el: Element | Document | ShadowRoot, eventNameList: string | string[], selector: string | string[] | null | undefined, option?: {
212
212
  capture?: boolean;
213
213
  onlyStopPropagation?: boolean;
214
214
  }): {
@@ -209,9 +209,9 @@ export type PopsDOMUtils_EventType = keyof PopsDOMUtils_Event;
209
209
  */
210
210
  export declare interface PopsDOMUtilsEventListenerOptionsAttribute {
211
211
  /**
212
- * DOMUtils的ownCallBack,元素上的监听事件就是它,移除事件时也需要传入这个函数
212
+ * DOMUtils的handlerCallBack,元素上的监听事件就是它,移除事件时也需要传入这个函数
213
213
  */
214
- callback: (event: Event) => void;
214
+ handlerCallBack: (event: Event, $selector?: HTMLElement) => void;
215
215
  /**
216
216
  * 属性配置
217
217
  */
@@ -219,7 +219,7 @@ export declare interface PopsDOMUtilsEventListenerOptionsAttribute {
219
219
  /**
220
220
  * 用户添加的事件
221
221
  */
222
- originCallBack: (event: Event, selectorTarget?: HTMLElement) => void;
222
+ callback: (event: Event, $selector?: HTMLElement) => void;
223
223
  /**
224
224
  * 子元素选择器
225
225
  */
@@ -101,7 +101,7 @@ declare class PopsDOMUtilsEvent {
101
101
  * DOMUtils.off(document.querySelector("a.xx"),"click")
102
102
  * DOMUtils.off("a.xx","click")
103
103
  */
104
- off<T extends PopsDOMUtils_EventType>(element: PopsDOMUtilsElementEventType, eventType: T | T[], callback?: (this: HTMLElement, event: PopsDOMUtils_Event[T]) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
104
+ off<T extends PopsDOMUtils_EventType>(element: PopsDOMUtilsElementEventType, eventType: T | T[], callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T]) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
105
105
  /**
106
106
  * 取消绑定事件
107
107
  * @param element 需要取消绑定的元素|元素数组
@@ -115,7 +115,7 @@ declare class PopsDOMUtilsEvent {
115
115
  * DOMUtils.off(document.querySelector("a.xx"),"click")
116
116
  * DOMUtils.off("a.xx","click")
117
117
  */
118
- off<T extends Event>(element: PopsDOMUtilsElementEventType, eventType: string | string[], callback?: (this: HTMLElement, event: T) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
118
+ off<T extends Event>(element: PopsDOMUtilsElementEventType, eventType: string | string[], callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
119
119
  /**
120
120
  * 取消绑定事件
121
121
  * @param element 需要取消绑定的元素|元素数组
@@ -130,7 +130,7 @@ declare class PopsDOMUtilsEvent {
130
130
  * DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
131
131
  * DOMUtils.off("a.xx",["click","tap","hover"])
132
132
  */
133
- off<T extends PopsDOMUtils_EventType>(element: PopsDOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: (this: HTMLElement, event: PopsDOMUtils_Event[T], selectorTarget: HTMLElement) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
133
+ off<T extends PopsDOMUtils_EventType>(element: PopsDOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T], $selector: E) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
134
134
  /**
135
135
  * 取消绑定事件
136
136
  * @param element 需要取消绑定的元素|元素数组
@@ -145,7 +145,7 @@ declare class PopsDOMUtilsEvent {
145
145
  * DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
146
146
  * DOMUtils.off("a.xx",["click","tap","hover"])
147
147
  */
148
- off<T extends Event>(element: PopsDOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
148
+ off<T extends Event>(element: PopsDOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
149
149
  /**
150
150
  * 取消绑定所有的事件
151
151
  * @param element 需要取消绑定的元素|元素数组
@@ -325,7 +325,7 @@ declare class PopsDOMUtilsEvent {
325
325
  * onlyStopPropagation: true,
326
326
  * })
327
327
  */
328
- preventEvent($el: HTMLElement, eventNameList: string | string[], option?: {
328
+ preventEvent($el: Element | Document | ShadowRoot, eventNameList: string | string[], option?: {
329
329
  /** (可选)是否捕获,默认false */
330
330
  capture?: boolean;
331
331
  /** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
@@ -352,7 +352,7 @@ declare class PopsDOMUtilsEvent {
352
352
  * onlyStopPropagation: true,
353
353
  * })
354
354
  */
355
- preventEvent($el: HTMLElement, eventNameList: string | string[], selector: string | string[] | null | undefined, option?: {
355
+ preventEvent($el: Element | Document | ShadowRoot, eventNameList: string | string[], selector: string | string[] | null | undefined, option?: {
356
356
  /** (可选)是否捕获,默认false */
357
357
  capture?: boolean;
358
358
  /** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whitesev/pops",
3
- "version": "4.2.0",
3
+ "version": "4.2.1",
4
4
  "description": "弹窗库,包含了alert、confirm、prompt、drawer、folder、loading、iframe、panel、tooltip、searchSuggestion、rightClickMenu组件",
5
5
  "keywords": [
6
6
  "ScriptCat",
@@ -209,9 +209,9 @@ export type PopsDOMUtils_EventType = keyof PopsDOMUtils_Event;
209
209
  */
210
210
  export declare interface PopsDOMUtilsEventListenerOptionsAttribute {
211
211
  /**
212
- * DOMUtils的ownCallBack,元素上的监听事件就是它,移除事件时也需要传入这个函数
212
+ * DOMUtils的handlerCallBack,元素上的监听事件就是它,移除事件时也需要传入这个函数
213
213
  */
214
- callback: (event: Event) => void;
214
+ handlerCallBack: (event: Event, $selector?: HTMLElement) => void;
215
215
  /**
216
216
  * 属性配置
217
217
  */
@@ -219,7 +219,7 @@ export declare interface PopsDOMUtilsEventListenerOptionsAttribute {
219
219
  /**
220
220
  * 用户添加的事件
221
221
  */
222
- originCallBack: (event: Event, selectorTarget?: HTMLElement) => void;
222
+ callback: (event: Event, $selector?: HTMLElement) => void;
223
223
  /**
224
224
  * 子元素选择器
225
225
  */
@@ -138,10 +138,10 @@ class PopsDOMUtilsEvent {
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,
@@ -235,39 +234,51 @@ class PopsDOMUtilsEvent {
235
234
  /**
236
235
  * 如果是once,那么删除该监听和元素上的事件和监听
237
236
  */
238
- function checkOptionOnceToRemoveEventListener() {
237
+ const checkOptionOnceToRemoveEventListener = ($el: PopsDOMUtilsElementEventType) => {
239
238
  if (listenerOption.once) {
240
- that.off(element, eventType as any, selector as any, callback as any, option);
239
+ this.off($el, eventTypeList, selector as any, callback as any, option);
241
240
  }
242
- }
243
- $elList.forEach((elementItem) => {
241
+ };
242
+ $elList.forEach(($elItem) => {
244
243
  /**
245
244
  * 事件回调
246
245
  * @param event
247
246
  */
248
- function domUtilsEventCallBack(event: Event) {
247
+ const handlerCallBack = function (event: Event) {
248
+ let call_this: Element | undefined = void 0;
249
+ let call_event: Event | undefined = void 0;
250
+ let call_$selector: HTMLElement | undefined = void 0;
251
+ let execCallback = false;
249
252
  if (selectorList.length) {
250
253
  // 存在子元素选择器
251
254
  // 这时候的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;
255
+ let $target: HTMLElement;
256
+ if (listenerOption.isComposedPath) {
257
+ // 可能为空
258
+ const composedPath = event.composedPath();
259
+ if (!composedPath.length && event.target) {
260
+ composedPath.push(event.target);
259
261
  }
262
+ $target = composedPath[0] as HTMLElement;
263
+ } else {
264
+ $target = event.target as HTMLElement;
265
+ }
266
+ let $parent = $elItem;
267
+ if (popsUtils.isWin($parent)) {
268
+ // window和document共用一个对象
269
+ // 这样就能处理子元素选择器无法匹配的问题
270
+ $parent = PopsCore.document.documentElement;
260
271
  }
261
- const findValue = selectorList.find((selectorItem) => {
272
+ const findValue = selectorList.find((selectors) => {
262
273
  // 判断目标元素是否匹配选择器
263
- if (that.matches(eventTarget, selectorItem)) {
274
+ if (that.matches($target, selectors)) {
264
275
  // 当前目标可以被selector所匹配到
265
276
  return true;
266
277
  }
267
278
  // 在上层与主元素之间寻找可以被selector所匹配到的
268
- const $closestMatches = that.closest<HTMLElement>(eventTarget, selectorItem);
269
- if ($closestMatches && totalParent?.contains($closestMatches)) {
270
- eventTarget = $closestMatches;
279
+ const $closestMatches = that.closest<HTMLElement>($target, selectors);
280
+ if ($closestMatches && (<HTMLElement>$parent)?.contains?.($closestMatches)) {
281
+ $target = $closestMatches;
271
282
  return true;
272
283
  }
273
284
  return false;
@@ -277,39 +288,48 @@ class PopsDOMUtilsEvent {
277
288
  try {
278
289
  OriginPrototype.Object.defineProperty(event, "target", {
279
290
  get() {
280
- return eventTarget;
291
+ return $target;
281
292
  },
282
293
  });
283
- } catch {
284
- // 忽略
285
- }
286
- listenerCallBack.call(eventTarget, event as any, eventTarget);
287
- checkOptionOnceToRemoveEventListener();
294
+ // oxlint-disable-next-line no-empty
295
+ } catch {}
296
+ execCallback = true;
297
+ call_this = $target;
298
+ call_event = event;
299
+ call_$selector = $target;
288
300
  }
289
301
  } else {
290
- // 这时候的this指向监听的元素
291
- listenerCallBack.call(elementItem, event as any);
292
- checkOptionOnceToRemoveEventListener();
302
+ execCallback = true;
303
+ call_this = $elItem as Element;
304
+ call_event = event;
293
305
  }
294
- }
306
+ if (execCallback) {
307
+ const result = listenerCallBack.call(call_this!, call_event!, call_$selector!);
308
+ checkOptionOnceToRemoveEventListener($elItem);
309
+ if (typeof result === "boolean" && !result) {
310
+ return false;
311
+ }
312
+ }
313
+ };
295
314
 
296
315
  // 遍历事件名设置元素事件
297
316
  eventTypeList.forEach((eventName) => {
298
- elementItem.addEventListener(eventName, domUtilsEventCallBack, listenerOption);
317
+ // add listener
318
+ $elItem.addEventListener(eventName, handlerCallBack, listenerOption);
299
319
  // 获取对象上的事件
300
320
  const elementEvents: {
301
321
  [k: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
302
- } = Reflect.get(elementItem, SymbolEvents) || {};
322
+ } = Reflect.get($elItem, SymbolEvents) || {};
303
323
  // 初始化对象上的xx事件
304
324
  elementEvents[eventName] = elementEvents[eventName] || [];
305
325
  elementEvents[eventName].push({
306
326
  selector: selectorList,
307
327
  option: listenerOption,
308
- callback: domUtilsEventCallBack,
309
- originCallBack: listenerCallBack,
328
+ handlerCallBack: handlerCallBack,
329
+ callback: listenerCallBack,
310
330
  });
311
331
  // 覆盖事件
312
- Reflect.set(elementItem, SymbolEvents, elementEvents);
332
+ Reflect.set($elItem, SymbolEvents, elementEvents);
313
333
  });
314
334
  });
315
335
 
@@ -329,11 +349,11 @@ class PopsDOMUtilsEvent {
329
349
  },
330
350
  /**
331
351
  * 主动触发事件
332
- * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
333
- * @param useDispatchToEmit 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
352
+ * @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
353
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了`$selector`的没有值
334
354
  */
335
- emit: (details?: object, useDispatchToEmit?: boolean) => {
336
- that.emit($elList, eventTypeList, details, useDispatchToEmit);
355
+ emit: (extraDetails?: object, useDispatchToTriggerEvent?: boolean) => {
356
+ that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
337
357
  },
338
358
  };
339
359
  }
@@ -353,7 +373,7 @@ class PopsDOMUtilsEvent {
353
373
  off<T extends PopsDOMUtils_EventType>(
354
374
  element: PopsDOMUtilsElementEventType,
355
375
  eventType: T | T[],
356
- callback?: (this: HTMLElement, event: PopsDOMUtils_Event[T]) => void,
376
+ callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T]) => void,
357
377
  option?: EventListenerOptions | boolean,
358
378
  filter?: (
359
379
  value: PopsDOMUtilsEventListenerOptionsAttribute,
@@ -377,7 +397,7 @@ class PopsDOMUtilsEvent {
377
397
  off<T extends Event>(
378
398
  element: PopsDOMUtilsElementEventType,
379
399
  eventType: string | string[],
380
- callback?: (this: HTMLElement, event: T) => void,
400
+ callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T) => void,
381
401
  option?: EventListenerOptions | boolean,
382
402
  filter?: (
383
403
  value: PopsDOMUtilsEventListenerOptionsAttribute,
@@ -403,7 +423,7 @@ class PopsDOMUtilsEvent {
403
423
  element: PopsDOMUtilsElementEventType,
404
424
  eventType: T | T[],
405
425
  selector?: string | string[] | undefined | null,
406
- callback?: (this: HTMLElement, event: PopsDOMUtils_Event[T], selectorTarget: HTMLElement) => void,
426
+ callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T], $selector: E) => void,
407
427
  option?: EventListenerOptions | boolean,
408
428
  filter?: (
409
429
  value: PopsDOMUtilsEventListenerOptionsAttribute,
@@ -429,7 +449,7 @@ class PopsDOMUtilsEvent {
429
449
  element: PopsDOMUtilsElementEventType,
430
450
  eventType: string | string[],
431
451
  selector?: string | string[] | undefined | null,
432
- callback?: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void,
452
+ callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void,
433
453
  option?: EventListenerOptions | boolean,
434
454
  filter?: (
435
455
  value: PopsDOMUtilsEventListenerOptionsAttribute,
@@ -444,9 +464,12 @@ class PopsDOMUtilsEvent {
444
464
  | string
445
465
  | string[]
446
466
  | undefined
447
- | ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void)
467
+ | (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
448
468
  | null,
449
- callback?: ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void) | EventListenerOptions | boolean,
469
+ callback?:
470
+ | (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
471
+ | EventListenerOptions
472
+ | boolean,
450
473
  option?:
451
474
  | EventListenerOptions
452
475
  | boolean
@@ -467,7 +490,7 @@ class PopsDOMUtilsEvent {
467
490
  * @param startIndex
468
491
  * @param option
469
492
  */
470
- function getOption(args1: IArguments, startIndex: number, option: EventListenerOptions) {
493
+ const getOption = function (args1: IArguments, startIndex: number, option: EventListenerOptions) {
471
494
  const currentParam: EventListenerOptions | boolean = args1[startIndex];
472
495
  if (typeof currentParam === "boolean") {
473
496
  option.capture = currentParam;
@@ -475,12 +498,12 @@ class PopsDOMUtilsEvent {
475
498
  option.capture = currentParam.capture;
476
499
  }
477
500
  return option;
478
- }
479
- const DOMUtilsContext = this;
501
+ };
502
+ const that = this;
480
503
  // eslint-disable-next-line prefer-rest-params
481
504
  const args = arguments;
482
505
  if (typeof element === "string") {
483
- element = DOMUtilsContext.selectorAll(element);
506
+ element = that.selectorAll(element);
484
507
  }
485
508
  if (element == null) {
486
509
  return;
@@ -488,31 +511,27 @@ class PopsDOMUtilsEvent {
488
511
  let $elList: HTMLElement[] = [];
489
512
  if (element instanceof NodeList || Array.isArray(element)) {
490
513
  element = element as HTMLElement[];
491
- $elList = $elList.concat(element);
514
+ $elList = $elList.concat(Array.from(element));
492
515
  } else {
493
516
  $elList.push(element as HTMLElement);
494
517
  }
495
518
  let eventTypeList: string[] = [];
496
519
  if (Array.isArray(eventType)) {
497
- eventTypeList = eventTypeList.concat(
498
- eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
499
- );
520
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
500
521
  } else if (typeof eventType === "string") {
501
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
522
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
502
523
  }
503
524
  // 子元素选择器
504
525
  let selectorList: string[] = [];
505
526
  if (Array.isArray(selector)) {
506
- selectorList = selectorList.concat(
507
- selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
508
- );
527
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
509
528
  } else if (typeof selector === "string") {
510
529
  selectorList.push(selector);
511
530
  }
512
531
  /**
513
532
  * 事件的回调函数
514
533
  */
515
- let listenerCallBack: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void = callback as any;
534
+ let listenerCallBack: (this: HTMLElement, event: T, $selector: HTMLElement) => void = callback as any;
516
535
 
517
536
  /**
518
537
  * 事件的配置
@@ -537,18 +556,18 @@ class PopsDOMUtilsEvent {
537
556
  array: PopsDOMUtilsEventListenerOptionsAttribute[]
538
557
  ) => boolean;
539
558
  }
540
- $elList.forEach((elementItem) => {
559
+ $elList.forEach(($elItem) => {
541
560
  // 获取对象上的事件
542
561
  const elementEvents: {
543
562
  [key: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
544
- } = Reflect.get(elementItem, SymbolEvents) || {};
563
+ } = Reflect.get($elItem, SymbolEvents) || {};
545
564
  eventTypeList.forEach((eventName) => {
546
565
  const handlers = elementEvents[eventName] || [];
547
566
  const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
548
567
  for (let index = 0; index < filterHandler.length; index++) {
549
568
  const handler = filterHandler[index];
550
569
  let flag = true;
551
- if (flag && listenerCallBack && handler.originCallBack !== listenerCallBack) {
570
+ if (flag && listenerCallBack && handler.callback !== listenerCallBack) {
552
571
  // callback不同
553
572
  flag = false;
554
573
  }
@@ -567,7 +586,7 @@ class PopsDOMUtilsEvent {
567
586
  flag = false;
568
587
  }
569
588
  if (flag) {
570
- elementItem.removeEventListener(eventName, handler.callback, handler.option);
589
+ $elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
571
590
  const findIndex = handlers.findIndex((item) => item === handler);
572
591
  if (findIndex !== -1) {
573
592
  handlers.splice(findIndex, 1);
@@ -579,7 +598,7 @@ class PopsDOMUtilsEvent {
579
598
  popsUtils.delete(elementEvents, eventType);
580
599
  }
581
600
  });
582
- Reflect.set(elementItem, SymbolEvents, elementEvents);
601
+ Reflect.set($elItem, SymbolEvents, elementEvents);
583
602
  });
584
603
  }
585
604
  /**
@@ -1080,7 +1099,7 @@ class PopsDOMUtilsEvent {
1080
1099
  * })
1081
1100
  */
1082
1101
  preventEvent(
1083
- $el: HTMLElement,
1102
+ $el: Element | Document | ShadowRoot,
1084
1103
  eventNameList: string | string[],
1085
1104
  option?: {
1086
1105
  /** (可选)是否捕获,默认false */
@@ -1111,7 +1130,7 @@ class PopsDOMUtilsEvent {
1111
1130
  * })
1112
1131
  */
1113
1132
  preventEvent(
1114
- $el: HTMLElement,
1133
+ $el: Element | Document | ShadowRoot,
1115
1134
  eventNameList: string | string[],
1116
1135
  selector: string | string[] | null | undefined,
1117
1136
  option?: {
@@ -1129,11 +1148,11 @@ class PopsDOMUtilsEvent {
1129
1148
  * 阻止事件的默认行为发生,并阻止事件传播
1130
1149
  */
1131
1150
  const stopEvent = (event: Event, onlyStopPropagation?: boolean) => {
1151
+ // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1152
+ event?.stopPropagation();
1153
+ // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1154
+ event?.stopImmediatePropagation();
1132
1155
  if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
1133
- // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1134
- event?.stopPropagation();
1135
- // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1136
- event?.stopImmediatePropagation();
1137
1156
  return;
1138
1157
  }
1139
1158
  // 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字