@whitesev/domutils 1.5.8 → 1.5.10

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.
@@ -42,7 +42,7 @@ export declare class DOMUtilsEvent {
42
42
  * console.log("事件触发",event)
43
43
  * })
44
44
  */
45
- on<T extends Event>(element: DOMUtilsElementEventType, eventType: string, callback: (this: HTMLElement, event: T) => void, option?: DOMUtilsEventListenerOption | boolean): void;
45
+ on<T extends Event>(element: DOMUtilsElementEventType, eventType: string | string[], callback: (this: HTMLElement, event: T) => void, option?: DOMUtilsEventListenerOption | boolean): void;
46
46
  /**
47
47
  * 绑定事件
48
48
  * @param element 需要绑定的元素|元素数组|window
@@ -55,16 +55,16 @@ export declare class DOMUtilsEvent {
55
55
  * + passive 表示事件监听器是否不会调用preventDefault()。默认为false
56
56
  * @example
57
57
  * // 监听元素a.xx的click、tap、hover事件
58
- * DOMUtils.on(document.querySelector("a.xx"),"click tap hover",(event)=>{
59
- * console.log("事件触发",event)
58
+ * DOMUtils.on(document.querySelector("a.xx"),"click tap hover",(event, selectorTarget)=>{
59
+ * console.log("事件触发", event, selectorTarget)
60
60
  * })
61
- * DOMUtils.on("a.xx",["click","tap","hover"],(event)=>{
62
- * console.log("事件触发",event)
61
+ * DOMUtils.on("a.xx",["click","tap","hover"],(event, selectorTarget)=>{
62
+ * console.log("事件触发", event, selectorTarget)
63
63
  * })
64
64
  * @example
65
65
  * // 监听全局document下的子元素a.xx的click事件
66
- * DOMUtils.on(document,"click tap hover","a.xx",(event)=>{
67
- * console.log("事件触发",event)
66
+ * DOMUtils.on(document,"click tap hover","a.xx",(event, selectorTarget)=>{
67
+ * console.log("事件触发", event, selectorTarget)
68
68
  * })
69
69
  */
70
70
  on<T extends DOMUtils_EventType>(element: DOMUtilsElementEventType, eventType: T | T[], selector: string | string[] | undefined | null, callback: (this: HTMLElement, event: DOMUtils_Event[T], selectorTarget: HTMLElement) => void, option?: DOMUtilsEventListenerOption | boolean): void;
@@ -80,19 +80,19 @@ export declare class DOMUtilsEvent {
80
80
  * + passive 表示事件监听器是否不会调用preventDefault()。默认为false
81
81
  * @example
82
82
  * // 监听元素a.xx的click、tap、hover事件
83
- * DOMUtils.on(document.querySelector("a.xx"),"click tap hover",(event)=>{
84
- * console.log("事件触发",event)
83
+ * DOMUtils.on(document.querySelector("a.xx"),"click tap hover",(event, selectorTarget)=>{
84
+ * console.log("事件触发", event, selectorTarget)
85
85
  * })
86
- * DOMUtils.on("a.xx",["click","tap","hover"],(event)=>{
87
- * console.log("事件触发",event)
86
+ * DOMUtils.on("a.xx",["click","tap","hover"],(event, selectorTarget)=>{
87
+ * console.log("事件触发", event, selectorTarget)
88
88
  * })
89
89
  * @example
90
90
  * // 监听全局document下的子元素a.xx的click事件
91
- * DOMUtils.on(document,"click tap hover","a.xx",(event)=>{
92
- * console.log("事件触发",event)
91
+ * DOMUtils.on(document,"click tap hover","a.xx",(event, selectorTarget)=>{
92
+ * console.log("事件触发", event, selectorTarget)
93
93
  * })
94
94
  */
95
- on<T extends Event>(element: DOMUtilsElementEventType, eventType: string, selector: string | string[] | (() => string | string[]) | undefined | null, callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void, option?: DOMUtilsEventListenerOption | boolean): void;
95
+ on<T extends Event>(element: DOMUtilsElementEventType, eventType: string | string[], selector: string | string[] | undefined | null, callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void, option?: DOMUtilsEventListenerOption | boolean): void;
96
96
  /**
97
97
  * 取消绑定事件
98
98
  * @param element 需要取消绑定的元素|元素数组
@@ -106,7 +106,7 @@ export declare class DOMUtilsEvent {
106
106
  * DOMUtils.off(document.querySelector("a.xx"),"click")
107
107
  * DOMUtils.off("a.xx","click")
108
108
  */
109
- off<T extends DOMUtils_EventType>(element: DOMUtilsElementEventType, eventType: T | T[], callback?: (this: HTMLElement, event: DOMUtils_Event[T], selectorTarget: HTMLElement) => void, option?: boolean | EventListenerOptions, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
109
+ off<T extends DOMUtils_EventType>(element: DOMUtilsElementEventType, eventType: T | T[], callback?: (this: HTMLElement, event: DOMUtils_Event[T]) => void, option?: EventListenerOptions | boolean, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
110
110
  /**
111
111
  * 取消绑定事件
112
112
  * @param element 需要取消绑定的元素|元素数组
@@ -120,7 +120,7 @@ export declare class DOMUtilsEvent {
120
120
  * DOMUtils.off(document.querySelector("a.xx"),"click")
121
121
  * DOMUtils.off("a.xx","click")
122
122
  */
123
- off<T extends Event>(element: DOMUtilsElementEventType, eventType: string, callback?: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void, option?: boolean | EventListenerOptions, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
123
+ off<T extends Event>(element: DOMUtilsElementEventType, eventType: string | string[], callback?: (this: HTMLElement, event: T) => void, option?: EventListenerOptions | boolean, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
124
124
  /**
125
125
  * 取消绑定事件
126
126
  * @param element 需要取消绑定的元素|元素数组
@@ -135,7 +135,7 @@ export declare class DOMUtilsEvent {
135
135
  * DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
136
136
  * DOMUtils.off("a.xx",["click","tap","hover"])
137
137
  */
138
- off<T extends DOMUtils_EventType>(element: DOMUtilsElementEventType, eventType: T | T[], selector?: DOMUtilsEventListenerOptionsAttribute["selector"] | undefined, callback?: (this: HTMLElement, event: DOMUtils_Event[T], selectorTarget: HTMLElement) => void, option?: boolean | EventListenerOptions, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
138
+ off<T extends DOMUtils_EventType>(element: DOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: (this: HTMLElement, event: DOMUtils_Event[T], selectorTarget: HTMLElement) => void, option?: EventListenerOptions | boolean, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
139
139
  /**
140
140
  * 取消绑定事件
141
141
  * @param element 需要取消绑定的元素|元素数组
@@ -150,7 +150,7 @@ export declare class DOMUtilsEvent {
150
150
  * DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
151
151
  * DOMUtils.off("a.xx",["click","tap","hover"])
152
152
  */
153
- off<T extends Event>(element: DOMUtilsElementEventType, eventType: string, selector?: DOMUtilsEventListenerOptionsAttribute["selector"] | undefined, callback?: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void, option?: boolean | EventListenerOptions, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
153
+ off<T extends Event>(element: DOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void, option?: EventListenerOptions | boolean, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
154
154
  /**
155
155
  * 取消绑定所有的事件
156
156
  * @param element 需要取消绑定的元素|元素数组
@@ -383,6 +383,7 @@ export declare class DOMUtilsEvent {
383
383
  * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
384
384
  * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
385
385
  * @param selector 选择器
386
+ * @param parent 指定父元素
386
387
  * @example
387
388
  * DOMUtils.selector("div:contains('测试')")
388
389
  * > div.xxx
@@ -393,8 +394,8 @@ export declare class DOMUtilsEvent {
393
394
  * DOMUtils.selector("div:regexp('^xxxx$')")
394
395
  * > div.xxx
395
396
  */
396
- selector<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K] | undefined;
397
- selector<E extends Element = Element>(selector: string): E | undefined;
397
+ selector<K extends keyof HTMLElementTagNameMap>(selector: K, parent?: Element | Document | DocumentFragment | ShadowRoot): HTMLElementTagNameMap[K] | undefined;
398
+ selector<E extends Element = Element>(selector: string, parent?: Element | Document | DocumentFragment | ShadowRoot): E | undefined;
398
399
  /**
399
400
  * 选择器,可使用以下的额外语法
400
401
  *
@@ -402,6 +403,7 @@ export declare class DOMUtilsEvent {
402
403
  * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
403
404
  * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
404
405
  * @param selector 选择器
406
+ * @param parent 指定父元素
405
407
  * @example
406
408
  * DOMUtils.selectorAll("div:contains('测试')")
407
409
  * > [div.xxx]
@@ -415,8 +417,8 @@ export declare class DOMUtilsEvent {
415
417
  * DOMUtils.selectorAll("div:regexp(/^xxx/ig)")
416
418
  * > [div.xxx]
417
419
  */
418
- selectorAll<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K][];
419
- selectorAll<E extends Element = Element>(selector: string): E[];
420
+ selectorAll<K extends keyof HTMLElementTagNameMap>(selector: K, parent?: Element | Document | DocumentFragment | ShadowRoot): HTMLElementTagNameMap[K][];
421
+ selectorAll<E extends Element = Element>(selector: string, parent?: Element | Document | DocumentFragment | ShadowRoot): E[];
420
422
  /**
421
423
  * 匹配元素,可使用以下的额外语法
422
424
  *
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@whitesev/domutils",
3
- "version": "1.5.8",
3
+ "version": "1.5.10",
4
4
  "description": "使用js重新对jQuery的部分函数进行了仿写",
5
+ "$schema": "https://json.schemastore.org/package.json",
5
6
  "main": "dist/index.cjs.js",
6
7
  "module": "dist/index.esm.js",
7
8
  "types": "dist/types/index.d.ts",
package/src/DOMUtils.ts CHANGED
@@ -12,7 +12,7 @@ class DOMUtils extends DOMUtilsEvent {
12
12
  super(option);
13
13
  }
14
14
  /** 版本号 */
15
- version = "2025.5.30";
15
+ version = "2025.6.7";
16
16
  /**
17
17
  * 获取元素的属性值
18
18
  * @param element 目标元素
@@ -1110,12 +1110,13 @@ class DOMUtils extends DOMUtilsEvent {
1110
1110
  width(
1111
1111
  element: HTMLElement | string | Window | typeof globalThis | Document,
1112
1112
  isShow: boolean = false
1113
- ) {
1113
+ ): number {
1114
1114
  let DOMUtilsContext = this;
1115
1115
  if (typeof element === "string") {
1116
1116
  element = DOMUtilsContext.selector<HTMLElement>(element)!;
1117
1117
  }
1118
1118
  if (element == null) {
1119
+ // @ts-ignore
1119
1120
  return;
1120
1121
  }
1121
1122
  if (DOMUtilsCommonUtils.isWin(element)) {
@@ -1213,7 +1214,7 @@ class DOMUtils extends DOMUtilsEvent {
1213
1214
  height(
1214
1215
  element: HTMLElement | string | Window | typeof globalThis | Document,
1215
1216
  isShow: boolean = false
1216
- ) {
1217
+ ): number {
1217
1218
  let DOMUtilsContext = this;
1218
1219
  if (DOMUtilsCommonUtils.isWin(element)) {
1219
1220
  return DOMUtilsContext.windowApi.window.document.documentElement
@@ -1293,9 +1294,9 @@ class DOMUtils extends DOMUtilsEvent {
1293
1294
  }
1294
1295
  /**
1295
1296
  * 获取元素的外部宽度(包括边框和外边距)
1296
- * @param {HTMLElement|string} element 要获取外部宽度的元素
1297
- * @param {boolean} [isShow=false] 是否已进行isShow,避免爆堆栈
1298
- * @returns {number} 元素的外部宽度,单位为像素
1297
+ * @param element 要获取外部宽度的元素
1298
+ * @param [isShow=false] 是否已进行isShow,避免爆堆栈
1299
+ * @returns 元素的外部宽度,单位为像素
1299
1300
  * @example
1300
1301
  * // 获取元素a.xx的外部宽度
1301
1302
  * DOMUtils.outerWidth(document.querySelector("a.xx"))
@@ -1312,7 +1313,7 @@ class DOMUtils extends DOMUtilsEvent {
1312
1313
  outerWidth(
1313
1314
  element: HTMLElement | string | Window | typeof globalThis | Document,
1314
1315
  isShow: boolean = false
1315
- ) {
1316
+ ): number {
1316
1317
  let DOMUtilsContext = this;
1317
1318
  if (DOMUtilsCommonUtils.isWin(element)) {
1318
1319
  return DOMUtilsContext.windowApi.window.innerWidth;
@@ -61,7 +61,7 @@ export class DOMUtilsEvent {
61
61
  */
62
62
  on<T extends Event>(
63
63
  element: DOMUtilsElementEventType,
64
- eventType: string,
64
+ eventType: string | string[],
65
65
  callback: (this: HTMLElement, event: T) => void,
66
66
  option?: DOMUtilsEventListenerOption | boolean
67
67
  ): void;
@@ -77,16 +77,16 @@ export class DOMUtilsEvent {
77
77
  * + passive 表示事件监听器是否不会调用preventDefault()。默认为false
78
78
  * @example
79
79
  * // 监听元素a.xx的click、tap、hover事件
80
- * DOMUtils.on(document.querySelector("a.xx"),"click tap hover",(event)=>{
81
- * console.log("事件触发",event)
80
+ * DOMUtils.on(document.querySelector("a.xx"),"click tap hover",(event, selectorTarget)=>{
81
+ * console.log("事件触发", event, selectorTarget)
82
82
  * })
83
- * DOMUtils.on("a.xx",["click","tap","hover"],(event)=>{
84
- * console.log("事件触发",event)
83
+ * DOMUtils.on("a.xx",["click","tap","hover"],(event, selectorTarget)=>{
84
+ * console.log("事件触发", event, selectorTarget)
85
85
  * })
86
86
  * @example
87
87
  * // 监听全局document下的子元素a.xx的click事件
88
- * DOMUtils.on(document,"click tap hover","a.xx",(event)=>{
89
- * console.log("事件触发",event)
88
+ * DOMUtils.on(document,"click tap hover","a.xx",(event, selectorTarget)=>{
89
+ * console.log("事件触发", event, selectorTarget)
90
90
  * })
91
91
  */
92
92
  on<T extends DOMUtils_EventType>(
@@ -112,22 +112,22 @@ export class DOMUtilsEvent {
112
112
  * + passive 表示事件监听器是否不会调用preventDefault()。默认为false
113
113
  * @example
114
114
  * // 监听元素a.xx的click、tap、hover事件
115
- * DOMUtils.on(document.querySelector("a.xx"),"click tap hover",(event)=>{
116
- * console.log("事件触发",event)
115
+ * DOMUtils.on(document.querySelector("a.xx"),"click tap hover",(event, selectorTarget)=>{
116
+ * console.log("事件触发", event, selectorTarget)
117
117
  * })
118
- * DOMUtils.on("a.xx",["click","tap","hover"],(event)=>{
119
- * console.log("事件触发",event)
118
+ * DOMUtils.on("a.xx",["click","tap","hover"],(event, selectorTarget)=>{
119
+ * console.log("事件触发", event, selectorTarget)
120
120
  * })
121
121
  * @example
122
122
  * // 监听全局document下的子元素a.xx的click事件
123
- * DOMUtils.on(document,"click tap hover","a.xx",(event)=>{
124
- * console.log("事件触发",event)
123
+ * DOMUtils.on(document,"click tap hover","a.xx",(event, selectorTarget)=>{
124
+ * console.log("事件触发", event, selectorTarget)
125
125
  * })
126
126
  */
127
127
  on<T extends Event>(
128
128
  element: DOMUtilsElementEventType,
129
- eventType: string,
130
- selector: string | string[] | (() => string | string[]) | undefined | null,
129
+ eventType: string | string[],
130
+ selector: string | string[] | undefined | null,
131
131
  callback: (
132
132
  this: HTMLElement,
133
133
  event: T,
@@ -146,11 +146,11 @@ export class DOMUtilsEvent {
146
146
  | Element
147
147
  | null
148
148
  | typeof globalThis,
149
- eventType: DOMUtils_EventType | DOMUtils_EventType[] | string,
149
+ eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
150
150
  selector:
151
151
  | string
152
- | undefined
153
152
  | string[]
153
+ | undefined
154
154
  | ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void)
155
155
  | null,
156
156
  callback?:
@@ -212,14 +212,26 @@ export class DOMUtilsEvent {
212
212
  // 事件名
213
213
  let eventTypeList: string[] = [];
214
214
  if (Array.isArray(eventType)) {
215
- eventTypeList = eventTypeList.concat(eventType as string[]);
215
+ eventTypeList = eventTypeList.concat(
216
+ eventType.filter(
217
+ (eventTypeItem) =>
218
+ typeof eventTypeItem === "string" && eventTypeItem.toString() !== ""
219
+ )
220
+ );
216
221
  } else if (typeof eventType === "string") {
217
- eventTypeList = eventTypeList.concat(eventType.split(" "));
222
+ eventTypeList = eventTypeList.concat(
223
+ eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== "")
224
+ );
218
225
  }
219
226
  // 子元素选择器
220
227
  let selectorList: string[] = [];
221
228
  if (Array.isArray(selector)) {
222
- selectorList = selectorList.concat(selector);
229
+ selectorList = selectorList.concat(
230
+ selector.filter(
231
+ (selectorItem) =>
232
+ typeof selectorItem === "string" && selectorItem.toString() !== ""
233
+ )
234
+ );
223
235
  } else if (typeof selector === "string") {
224
236
  selectorList.push(selector);
225
237
  }
@@ -237,11 +249,12 @@ export class DOMUtilsEvent {
237
249
  isComposedPath: false,
238
250
  };
239
251
  if (typeof selector === "function") {
240
- /* 这是为没有selector的情况 */
252
+ // 这是为没有selector的情况
253
+ // 那么它就是callback
241
254
  listenerCallBack = selector as any;
242
255
  listenerOption = getOption(args, 3, listenerOption);
243
256
  } else {
244
- /* 这是存在selector的情况 */
257
+ // 这是存在selector的情况
245
258
  listenerOption = getOption(args, 4, listenerOption);
246
259
  }
247
260
  /**
@@ -270,12 +283,15 @@ export class DOMUtilsEvent {
270
283
  let eventTarget = listenerOption.isComposedPath
271
284
  ? (event.composedPath()[0] as HTMLElement)
272
285
  : (event.target as HTMLElement);
273
- let totalParent =
274
- DOMUtilsCommonUtils.isWin(elementItem) ||
275
- // @ts-ignore
276
- elementItem === DOMUtilsContext.windowApi.document
277
- ? DOMUtilsContext.windowApi.document.documentElement
278
- : elementItem;
286
+ let totalParent = elementItem;
287
+ if (DOMUtilsCommonUtils.isWin(totalParent)) {
288
+ if (
289
+ totalParent ===
290
+ (DOMUtilsContext.windowApi.document as any as HTMLElement)
291
+ ) {
292
+ totalParent = DOMUtilsContext.windowApi.document.documentElement;
293
+ }
294
+ }
279
295
  let findValue = selectorList.find((selectorItem) => {
280
296
  // 判断目标元素是否匹配选择器
281
297
  if (DOMUtilsContext.matches(eventTarget, selectorItem)) {
@@ -322,8 +338,7 @@ export class DOMUtilsEvent {
322
338
  /* 获取对象上的事件 */
323
339
  let elementEvents: {
324
340
  [k: string]: DOMUtilsEventListenerOptionsAttribute[];
325
- // @ts-ignore
326
- } = elementItem[DOMUtilsData.SymbolEvents] || {};
341
+ } = Reflect.get(elementItem, DOMUtilsData.SymbolEvents) || {};
327
342
  /* 初始化对象上的xx事件 */
328
343
  elementEvents[eventName] = elementEvents[eventName] || [];
329
344
  elementEvents[eventName].push({
@@ -333,8 +348,7 @@ export class DOMUtilsEvent {
333
348
  originCallBack: listenerCallBack,
334
349
  });
335
350
  /* 覆盖事件 */
336
- // @ts-ignore
337
- elementItem[DOMUtilsData.SymbolEvents] = elementEvents;
351
+ Reflect.set(elementItem, DOMUtilsData.SymbolEvents, elementEvents);
338
352
  });
339
353
  });
340
354
  }
@@ -354,12 +368,8 @@ export class DOMUtilsEvent {
354
368
  off<T extends DOMUtils_EventType>(
355
369
  element: DOMUtilsElementEventType,
356
370
  eventType: T | T[],
357
- callback?: (
358
- this: HTMLElement,
359
- event: DOMUtils_Event[T],
360
- selectorTarget: HTMLElement
361
- ) => void,
362
- option?: boolean | EventListenerOptions,
371
+ callback?: (this: HTMLElement, event: DOMUtils_Event[T]) => void,
372
+ option?: EventListenerOptions | boolean,
363
373
  filter?: (
364
374
  value: DOMUtilsEventListenerOptionsAttribute,
365
375
  index: number,
@@ -381,13 +391,9 @@ export class DOMUtilsEvent {
381
391
  */
382
392
  off<T extends Event>(
383
393
  element: DOMUtilsElementEventType,
384
- eventType: string,
385
- callback?: (
386
- this: HTMLElement,
387
- event: T,
388
- selectorTarget: HTMLElement
389
- ) => void,
390
- option?: boolean | EventListenerOptions,
394
+ eventType: string | string[],
395
+ callback?: (this: HTMLElement, event: T) => void,
396
+ option?: EventListenerOptions | boolean,
391
397
  filter?: (
392
398
  value: DOMUtilsEventListenerOptionsAttribute,
393
399
  index: number,
@@ -411,13 +417,13 @@ export class DOMUtilsEvent {
411
417
  off<T extends DOMUtils_EventType>(
412
418
  element: DOMUtilsElementEventType,
413
419
  eventType: T | T[],
414
- selector?: DOMUtilsEventListenerOptionsAttribute["selector"] | undefined,
420
+ selector?: string | string[] | undefined | null,
415
421
  callback?: (
416
422
  this: HTMLElement,
417
423
  event: DOMUtils_Event[T],
418
424
  selectorTarget: HTMLElement
419
425
  ) => void,
420
- option?: boolean | EventListenerOptions,
426
+ option?: EventListenerOptions | boolean,
421
427
  filter?: (
422
428
  value: DOMUtilsEventListenerOptionsAttribute,
423
429
  index: number,
@@ -440,14 +446,14 @@ export class DOMUtilsEvent {
440
446
  */
441
447
  off<T extends Event>(
442
448
  element: DOMUtilsElementEventType,
443
- eventType: string,
444
- selector?: DOMUtilsEventListenerOptionsAttribute["selector"] | undefined,
449
+ eventType: string | string[],
450
+ selector?: string | string[] | undefined | null,
445
451
  callback?: (
446
452
  this: HTMLElement,
447
453
  event: T,
448
454
  selectorTarget: HTMLElement
449
455
  ) => void,
450
- option?: boolean | EventListenerOptions,
456
+ option?: EventListenerOptions | boolean,
451
457
  filter?: (
452
458
  value: DOMUtilsEventListenerOptionsAttribute,
453
459
  index: number,
@@ -465,18 +471,20 @@ export class DOMUtilsEvent {
465
471
  | Element
466
472
  | null
467
473
  | typeof globalThis,
468
- eventType: DOMUtils_EventType | DOMUtils_EventType[] | string,
469
- selector?:
470
- | DOMUtilsEventListenerOptionsAttribute["selector"]
474
+ eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
475
+ selector:
476
+ | string
477
+ | string[]
471
478
  | undefined
472
- | ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void),
479
+ | ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void)
480
+ | null,
473
481
  callback?:
474
482
  | ((this: HTMLElement, event: T, selectorTarget: HTMLElement) => void)
475
- | boolean
476
- | EventListenerOptions,
483
+ | EventListenerOptions
484
+ | boolean,
477
485
  option?:
478
- | boolean
479
486
  | EventListenerOptions
487
+ | boolean
480
488
  | ((
481
489
  value: DOMUtilsEventListenerOptionsAttribute,
482
490
  index: number,
@@ -499,7 +507,7 @@ export class DOMUtilsEvent {
499
507
  startIndex: number,
500
508
  option: EventListenerOptions
501
509
  ) {
502
- let currentParam: boolean | EventListenerOptions = args1[startIndex];
510
+ let currentParam: EventListenerOptions | boolean = args1[startIndex];
503
511
  if (typeof currentParam === "boolean") {
504
512
  option.capture = currentParam;
505
513
  } else if (
@@ -527,14 +535,26 @@ export class DOMUtilsEvent {
527
535
  }
528
536
  let eventTypeList: string[] = [];
529
537
  if (Array.isArray(eventType)) {
530
- eventTypeList = eventTypeList.concat(eventType as string[]);
538
+ eventTypeList = eventTypeList.concat(
539
+ eventType.filter(
540
+ (eventTypeItem) =>
541
+ typeof eventTypeItem === "string" && eventTypeItem.toString() !== ""
542
+ )
543
+ );
531
544
  } else if (typeof eventType === "string") {
532
- eventTypeList = eventTypeList.concat(eventType.split(" "));
545
+ eventTypeList = eventTypeList.concat(
546
+ eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== "")
547
+ );
533
548
  }
534
549
  // 子元素选择器
535
550
  let selectorList: string[] = [];
536
551
  if (Array.isArray(selector)) {
537
- selectorList = selectorList.concat(selector);
552
+ selectorList = selectorList.concat(
553
+ selector.filter(
554
+ (selectorItem) =>
555
+ typeof selectorItem === "string" && selectorItem.toString() !== ""
556
+ )
557
+ );
538
558
  } else if (typeof selector === "string") {
539
559
  selectorList.push(selector);
540
560
  }
@@ -554,10 +574,12 @@ export class DOMUtilsEvent {
554
574
  capture: false,
555
575
  };
556
576
  if (typeof selector === "function") {
557
- /* 这是为没有selector的情况 */
577
+ // 这是为没有selector的情况
578
+ // 那么它就是callback
558
579
  listenerCallBack = selector;
559
580
  listenerOption = getOption(args, 3, listenerOption);
560
581
  } else {
582
+ // 这是存在selector的情况
561
583
  listenerOption = getOption(args, 4, listenerOption);
562
584
  }
563
585
  // 是否移除所有事件
@@ -574,11 +596,11 @@ export class DOMUtilsEvent {
574
596
  }
575
597
  elementList.forEach((elementItem) => {
576
598
  /* 获取对象上的事件 */
577
- // @ts-ignore
578
- let elementEvents = elementItem[DOMUtilsData.SymbolEvents] || {};
599
+ let elementEvents: {
600
+ [key: string]: DOMUtilsEventListenerOptionsAttribute[];
601
+ } = Reflect.get(elementItem, DOMUtilsData.SymbolEvents) || {};
579
602
  eventTypeList.forEach((eventName) => {
580
- let handlers: DOMUtilsEventListenerOptionsAttribute[] =
581
- elementEvents[eventName] || [];
603
+ let handlers = elementEvents[eventName] || [];
582
604
  if (typeof filter === "function") {
583
605
  handlers = handlers.filter(filter);
584
606
  }
@@ -619,8 +641,7 @@ export class DOMUtilsEvent {
619
641
  DOMUtilsCommonUtils.delete(elementEvents, eventType);
620
642
  }
621
643
  });
622
- // @ts-ignore
623
- elementItem[DOMUtilsData.SymbolEvents] = elementEvents;
644
+ Reflect.set(elementItem, DOMUtilsData.SymbolEvents, elementEvents);
624
645
  });
625
646
  }
626
647
  /**
@@ -687,8 +708,8 @@ export class DOMUtilsEvent {
687
708
  capture: handler["option"]["capture"],
688
709
  });
689
710
  }
690
- // @ts-ignore
691
- DOMUtilsCommonUtils.delete(elementItem[symbolEvents], eventName);
711
+ let events = Reflect.get(elementItem, symbolEvents);
712
+ DOMUtilsCommonUtils.delete(events, eventName);
692
713
  });
693
714
  });
694
715
  });
@@ -1301,6 +1322,7 @@ export class DOMUtilsEvent {
1301
1322
  * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1302
1323
  * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1303
1324
  * @param selector 选择器
1325
+ * @param parent 指定父元素
1304
1326
  * @example
1305
1327
  * DOMUtils.selector("div:contains('测试')")
1306
1328
  * > div.xxx
@@ -1312,11 +1334,18 @@ export class DOMUtilsEvent {
1312
1334
  * > div.xxx
1313
1335
  */
1314
1336
  selector<K extends keyof HTMLElementTagNameMap>(
1315
- selector: K
1337
+ selector: K,
1338
+ parent?: Element | Document | DocumentFragment | ShadowRoot
1316
1339
  ): HTMLElementTagNameMap[K] | undefined;
1317
- selector<E extends Element = Element>(selector: string): E | undefined;
1318
- selector<E extends Element = Element>(selector: string) {
1319
- return this.selectorAll<E>(selector)[0];
1340
+ selector<E extends Element = Element>(
1341
+ selector: string,
1342
+ parent?: Element | Document | DocumentFragment | ShadowRoot
1343
+ ): E | undefined;
1344
+ selector<E extends Element = Element>(
1345
+ selector: string,
1346
+ parent?: Element | Document | DocumentFragment | ShadowRoot
1347
+ ) {
1348
+ return this.selectorAll<E>(selector, parent)[0];
1320
1349
  }
1321
1350
  /**
1322
1351
  * 选择器,可使用以下的额外语法
@@ -1325,6 +1354,7 @@ export class DOMUtilsEvent {
1325
1354
  * + :empty 作用:找到既没有文本内容也没有子元素的指定元素
1326
1355
  * + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
1327
1356
  * @param selector 选择器
1357
+ * @param parent 指定父元素
1328
1358
  * @example
1329
1359
  * DOMUtils.selectorAll("div:contains('测试')")
1330
1360
  * > [div.xxx]
@@ -1339,18 +1369,24 @@ export class DOMUtilsEvent {
1339
1369
  * > [div.xxx]
1340
1370
  */
1341
1371
  selectorAll<K extends keyof HTMLElementTagNameMap>(
1342
- selector: K
1372
+ selector: K,
1373
+ parent?: Element | Document | DocumentFragment | ShadowRoot
1343
1374
  ): HTMLElementTagNameMap[K][];
1344
- selectorAll<E extends Element = Element>(selector: string): E[];
1345
- selectorAll<E extends Element = Element>(selector: string) {
1375
+ selectorAll<E extends Element = Element>(
1376
+ selector: string,
1377
+ parent?: Element | Document | DocumentFragment | ShadowRoot
1378
+ ): E[];
1379
+ selectorAll<E extends Element = Element>(
1380
+ selector: string,
1381
+ parent?: Element | Document | DocumentFragment | ShadowRoot
1382
+ ) {
1346
1383
  const context = this;
1384
+ parent = parent || context.windowApi.document;
1347
1385
  selector = selector.trim();
1348
1386
  if (selector.match(/[^\s]{1}:empty$/gi)) {
1349
1387
  // empty 语法
1350
1388
  selector = selector.replace(/:empty$/gi, "");
1351
- return Array.from(
1352
- context.windowApi.document.querySelectorAll<E>(selector)
1353
- ).filter(($ele) => {
1389
+ return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1354
1390
  return $ele?.innerHTML?.trim() === "";
1355
1391
  });
1356
1392
  } else if (
@@ -1361,9 +1397,7 @@ export class DOMUtilsEvent {
1361
1397
  let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1362
1398
  let text = textMatch![2];
1363
1399
  selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1364
- return Array.from(
1365
- context.windowApi.document.querySelectorAll<E>(selector)
1366
- ).filter(($ele) => {
1400
+ return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1367
1401
  // @ts-ignore
1368
1402
  return ($ele?.textContent || $ele?.innerText)?.includes(text);
1369
1403
  });
@@ -1382,17 +1416,13 @@ export class DOMUtilsEvent {
1382
1416
  }
1383
1417
  let regexp = new RegExp(pattern, flags);
1384
1418
  selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1385
- return Array.from(
1386
- context.windowApi.document.querySelectorAll<E>(selector)
1387
- ).filter(($ele) => {
1419
+ return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
1388
1420
  // @ts-ignore
1389
1421
  return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
1390
1422
  });
1391
1423
  } else {
1392
1424
  // 普通语法
1393
- return Array.from(
1394
- context.windowApi.document.querySelectorAll<E>(selector)
1395
- );
1425
+ return Array.from(parent.querySelectorAll<E>(selector));
1396
1426
  }
1397
1427
  }
1398
1428
  /**