@whitesev/domutils 1.4.0 → 1.4.3

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.
@@ -67,7 +67,7 @@ export declare class DOMUtilsEvent {
67
67
  * console.log("事件触发",event)
68
68
  * })
69
69
  */
70
- on<T extends DOMUtils_EventType>(element: DOMUtilsElementEventType, eventType: T | T[], selector: string | undefined | null, callback: (event: DOMUtils_Event[T]) => void, option?: boolean | AddEventListenerOptions): void;
70
+ on<T extends DOMUtils_EventType>(element: DOMUtilsElementEventType, eventType: T | T[], selector: string | string[] | undefined | null, callback: (event: DOMUtils_Event[T]) => void, option?: boolean | AddEventListenerOptions): void;
71
71
  /**
72
72
  * 绑定事件
73
73
  * @param element 需要绑定的元素|元素数组|window
@@ -92,7 +92,7 @@ export declare class DOMUtilsEvent {
92
92
  * console.log("事件触发",event)
93
93
  * })
94
94
  */
95
- on<T extends Event>(element: DOMUtilsElementEventType, eventType: string, selector: string | undefined | null, callback: (event: T) => void, option?: boolean | AddEventListenerOptions): void;
95
+ on<T extends Event>(element: DOMUtilsElementEventType, eventType: string, selector: string | string[] | (() => string | string[]) | undefined | null, callback: (event: T) => void, option?: boolean | AddEventListenerOptions): void;
96
96
  /**
97
97
  * 取消绑定事件
98
98
  * @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?: string | undefined, callback?: (event: DOMUtils_Event[T]) => void, option?: boolean | AddEventListenerOptions, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
138
+ off<T extends DOMUtils_EventType>(element: DOMUtilsElementEventType, eventType: T | T[], selector?: DOMUtilsEventListenerOptionsAttribute["selector"] | undefined, callback?: (event: DOMUtils_Event[T]) => void, option?: boolean | AddEventListenerOptions, 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?: string | undefined, callback?: (event: T) => void, option?: boolean | AddEventListenerOptions, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
153
+ off<T extends Event>(element: DOMUtilsElementEventType, eventType: string, selector?: DOMUtilsEventListenerOptionsAttribute["selector"] | undefined, callback?: (event: T) => void, option?: boolean | AddEventListenerOptions, filter?: (value: DOMUtilsEventListenerOptionsAttribute, index: number, array: DOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
154
154
  /**
155
155
  * 取消绑定所有的事件
156
156
  * @param element 需要取消绑定的元素|元素数组
@@ -192,7 +192,7 @@ export declare class DOMUtilsEvent {
192
192
  * @param element 需要触发的元素|元素数组|window
193
193
  * @param eventType 需要触发的事件
194
194
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
195
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
195
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
196
196
  * @example
197
197
  * // 触发元素a.xx的click事件
198
198
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -411,6 +411,9 @@ export declare class DOMUtilsEvent {
411
411
  * @example
412
412
  * DOMUtils.selectorAll("div:regexp('^xxxx$')")
413
413
  * > [div.xxx]
414
+ * @example
415
+ * DOMUtils.selectorAll("div:regexp(/^xxx/ig)")
416
+ * > [div.xxx]
414
417
  */
415
418
  selectorAll<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K][];
416
419
  selectorAll<E extends Element = Element>(selector: string): E[];
@@ -205,9 +205,9 @@ export declare type DOMUtils_EventType = keyof DOMUtils_Event;
205
205
  */
206
206
  export declare interface DOMUtilsEventListenerOptionsAttribute {
207
207
  /**
208
- * 自定义的ownCallBack
208
+ * DOMUtils的ownCallBack,元素上的监听事件就是它,移除事件时也需要传入这个函数
209
209
  */
210
- callback: () => void;
210
+ callback: (event: Event) => void;
211
211
  /**
212
212
  * 属性配置
213
213
  */
@@ -215,11 +215,11 @@ export declare interface DOMUtilsEventListenerOptionsAttribute {
215
215
  /**
216
216
  * 用户添加的事件
217
217
  */
218
- originCallBack: () => void;
218
+ originCallBack: (event: Event) => void;
219
219
  /**
220
220
  * 子元素选择器
221
221
  */
222
- selector?: string;
222
+ selector?: string[];
223
223
  }
224
224
 
225
225
  export declare type DOMUtilsElementEventType =
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whitesev/domutils",
3
- "version": "1.4.0",
3
+ "version": "1.4.3",
4
4
  "description": "使用js重新对jQuery的部分函数进行了仿写",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
@@ -36,11 +36,12 @@
36
36
  "tslib": "^2.6.3"
37
37
  },
38
38
  "devDependencies": {
39
- "typescript": "^5.5.4"
39
+ "typescript": "^5.7.2"
40
40
  },
41
41
  "scripts": {
42
42
  "dev": "rollup --config --watch",
43
43
  "build": "rollup --config",
44
- "build:all": "rollup --config"
44
+ "build:all": "rollup --config",
45
+ "build:all-new": "rollup --config"
45
46
  }
46
47
  }
package/src/DOMUtils.ts CHANGED
@@ -20,7 +20,7 @@ class DOMUtils extends DOMUtilsEvent {
20
20
  super(option);
21
21
  }
22
22
  /** 版本号 */
23
- version = "2024.11.6";
23
+ version = "2024.12.3";
24
24
  /**
25
25
  * 获取元素的属性值
26
26
  * @param element 目标元素
@@ -92,7 +92,7 @@ export class DOMUtilsEvent {
92
92
  on<T extends DOMUtils_EventType>(
93
93
  element: DOMUtilsElementEventType,
94
94
  eventType: T | T[],
95
- selector: string | undefined | null,
95
+ selector: string | string[] | undefined | null,
96
96
  callback: (event: DOMUtils_Event[T]) => void,
97
97
  option?: boolean | AddEventListenerOptions
98
98
  ): void;
@@ -123,7 +123,7 @@ export class DOMUtilsEvent {
123
123
  on<T extends Event>(
124
124
  element: DOMUtilsElementEventType,
125
125
  eventType: string,
126
- selector: string | undefined | null,
126
+ selector: string | string[] | (() => string | string[]) | undefined | null,
127
127
  callback: (event: T) => void,
128
128
  option?: boolean | AddEventListenerOptions
129
129
  ): void;
@@ -139,7 +139,7 @@ export class DOMUtilsEvent {
139
139
  | null
140
140
  | typeof globalThis,
141
141
  eventType: DOMUtils_EventType | DOMUtils_EventType[] | string,
142
- selector: string | undefined | ((event: T) => void) | null,
142
+ selector: string | undefined | string[] | ((event: T) => void) | null,
143
143
  callback?: ((event: T) => void) | boolean | AddEventListenerOptions,
144
144
  option?: boolean | AddEventListenerOptions
145
145
  ) {
@@ -190,15 +190,23 @@ export class DOMUtilsEvent {
190
190
  } else {
191
191
  elementList.push(element as HTMLElement);
192
192
  }
193
-
193
+ // 事件名
194
194
  let eventTypeList: string[] = [];
195
195
  if (Array.isArray(eventType)) {
196
196
  eventTypeList = eventTypeList.concat(eventType as string[]);
197
197
  } else if (typeof eventType === "string") {
198
198
  eventTypeList = eventTypeList.concat(eventType.split(" "));
199
199
  }
200
- let _selector_: string | undefined = selector as any;
201
- let _callback_: (event: T) => void = callback as any;
200
+ // 子元素选择器
201
+ let selectorList: string[] = [];
202
+ if (Array.isArray(selector)) {
203
+ selectorList = selectorList.concat(selector);
204
+ } else if (typeof selector === "string") {
205
+ selectorList.push(selector);
206
+ }
207
+ // 事件回调
208
+ let _callback_: (event: Event) => void = callback as any;
209
+ // 事件配置
202
210
  let _option_: AddEventListenerOptions = {
203
211
  capture: false,
204
212
  once: false,
@@ -206,8 +214,7 @@ export class DOMUtilsEvent {
206
214
  };
207
215
  if (typeof selector === "function") {
208
216
  /* 这是为没有selector的情况 */
209
- _selector_ = void 0;
210
- _callback_ = selector;
217
+ _callback_ = selector as any;
211
218
  _option_ = getOption(args, 3, _option_);
212
219
  } else {
213
220
  /* 这是存在selector的情况 */
@@ -228,31 +235,40 @@ export class DOMUtilsEvent {
228
235
  }
229
236
  }
230
237
  elementList.forEach((elementItem) => {
231
- function ownCallBack(event: Event) {
238
+ /**
239
+ * 事件回调
240
+ * @param event
241
+ */
242
+ function domUtilsEventCallBack(event: Event) {
232
243
  let target = event.target as HTMLElement;
233
- if (_selector_) {
244
+ if (selectorList.length) {
234
245
  /* 存在自定义子元素选择器 */
235
246
  let totalParent = DOMUtilsCommonUtils.isWin(elementItem)
236
247
  ? DOMUtilsContext.windowApi.document.documentElement
237
248
  : elementItem;
238
- if (target.matches(_selector_)) {
239
- /* 当前目标可以被selector所匹配到 */
240
- _callback_.call(target, event as any);
241
- checkOptionOnceToRemoveEventListener();
242
- } else if (
243
- target.closest(_selector_) &&
244
- totalParent.contains(target.closest(_selector_))
245
- ) {
246
- /* 在上层与主元素之间寻找可以被selector所匹配到的 */
247
- let closestElement = target.closest(_selector_);
248
- /* event的target值不能直接修改 */
249
- OriginPrototype.Object.defineProperty(event, "target", {
250
- get() {
251
- return closestElement;
252
- },
253
- });
254
- _callback_.call(closestElement, event as any);
255
- checkOptionOnceToRemoveEventListener();
249
+ for (let index = 0; index < selectorList.length; index++) {
250
+ const selectorItem = selectorList[index];
251
+ if (target.matches(selectorItem)) {
252
+ /* 当前目标可以被selector所匹配到 */
253
+ _callback_.call(target, event as any);
254
+ checkOptionOnceToRemoveEventListener();
255
+ break;
256
+ } else if (
257
+ target.closest(selectorItem) &&
258
+ totalParent.contains(target.closest(selectorItem))
259
+ ) {
260
+ /* 在上层与主元素之间寻找可以被selector所匹配到的 */
261
+ let closestElement = target.closest(selectorItem);
262
+ /* event的target值不能直接修改 */
263
+ OriginPrototype.Object.defineProperty(event, "target", {
264
+ get() {
265
+ return closestElement;
266
+ },
267
+ });
268
+ _callback_.call(closestElement, event as any);
269
+ checkOptionOnceToRemoveEventListener();
270
+ break;
271
+ }
256
272
  }
257
273
  } else {
258
274
  _callback_.call(elementItem, event as any);
@@ -262,24 +278,27 @@ export class DOMUtilsEvent {
262
278
 
263
279
  /* 遍历事件名设置元素事件 */
264
280
  eventTypeList.forEach((eventName) => {
265
- elementItem.addEventListener(eventName, ownCallBack, _option_);
266
-
267
- if (_callback_ && (_callback_ as any).delegate) {
268
- elementItem.setAttribute("data-delegate", _selector_ as string);
269
- }
281
+ elementItem.addEventListener(
282
+ eventName,
283
+ domUtilsEventCallBack,
284
+ _option_
285
+ );
270
286
  /* 获取对象上的事件 */
271
- let elementEvents =
272
- (elementItem as any)[DOMUtilsData.SymbolEvents] || {};
287
+ let elementEvents: {
288
+ [k: string]: DOMUtilsEventListenerOptionsAttribute[];
289
+ // @ts-ignore
290
+ } = elementItem[DOMUtilsData.SymbolEvents] || {};
273
291
  /* 初始化对象上的xx事件 */
274
292
  elementEvents[eventName] = elementEvents[eventName] || [];
275
293
  elementEvents[eventName].push({
276
- selector: _selector_,
294
+ selector: selectorList,
277
295
  option: _option_,
278
- callback: ownCallBack,
296
+ callback: domUtilsEventCallBack,
279
297
  originCallBack: _callback_,
280
298
  });
281
299
  /* 覆盖事件 */
282
- (elementItem as any)[DOMUtilsData.SymbolEvents] = elementEvents;
300
+ // @ts-ignore
301
+ elementItem[DOMUtilsData.SymbolEvents] = elementEvents;
283
302
  });
284
303
  });
285
304
  }
@@ -348,7 +367,7 @@ export class DOMUtilsEvent {
348
367
  off<T extends DOMUtils_EventType>(
349
368
  element: DOMUtilsElementEventType,
350
369
  eventType: T | T[],
351
- selector?: string | undefined,
370
+ selector?: DOMUtilsEventListenerOptionsAttribute["selector"] | undefined,
352
371
  callback?: (event: DOMUtils_Event[T]) => void,
353
372
  option?: boolean | AddEventListenerOptions,
354
373
  filter?: (
@@ -374,7 +393,7 @@ export class DOMUtilsEvent {
374
393
  off<T extends Event>(
375
394
  element: DOMUtilsElementEventType,
376
395
  eventType: string,
377
- selector?: string | undefined,
396
+ selector?: DOMUtilsEventListenerOptionsAttribute["selector"] | undefined,
378
397
  callback?: (event: T) => void,
379
398
  option?: boolean | AddEventListenerOptions,
380
399
  filter?: (
@@ -395,7 +414,10 @@ export class DOMUtilsEvent {
395
414
  | null
396
415
  | typeof globalThis,
397
416
  eventType: DOMUtils_EventType | DOMUtils_EventType[] | string,
398
- selector?: string | undefined | ((event: T) => void),
417
+ selector?:
418
+ | DOMUtilsEventListenerOptionsAttribute["selector"]
419
+ | undefined
420
+ | ((event: T) => void),
399
421
  callback?: ((event: T) => void) | boolean | AddEventListenerOptions,
400
422
  option?:
401
423
  | boolean
@@ -453,10 +475,13 @@ export class DOMUtilsEvent {
453
475
  } else if (typeof eventType === "string") {
454
476
  eventTypeList = eventTypeList.concat(eventType.split(" "));
455
477
  }
456
- /**
457
- * 子元素选择器
458
- */
459
- let _selector_: string | undefined = selector as any;
478
+ // 子元素选择器
479
+ let selectorList: string[] = [];
480
+ if (Array.isArray(selector)) {
481
+ selectorList = selectorList.concat(selector);
482
+ } else if (typeof selector === "string") {
483
+ selectorList.push(selector);
484
+ }
460
485
  /**
461
486
  * 事件的回调函数
462
487
  */
@@ -470,7 +495,6 @@ export class DOMUtilsEvent {
470
495
  };
471
496
  if (typeof selector === "function") {
472
497
  /* 这是为没有selector的情况 */
473
- _selector_ = void 0;
474
498
  _callback_ = selector;
475
499
  _option_ = getOption(args, 3, _option_);
476
500
  } else {
@@ -478,7 +502,8 @@ export class DOMUtilsEvent {
478
502
  }
479
503
  elementList.forEach((elementItem) => {
480
504
  /* 获取对象上的事件 */
481
- let elementEvents = (elementItem as any)[DOMUtilsData.SymbolEvents] || {};
505
+ // @ts-ignore
506
+ let elementEvents = elementItem[DOMUtilsData.SymbolEvents] || {};
482
507
  eventTypeList.forEach((eventName) => {
483
508
  let handlers: DOMUtilsEventListenerOptionsAttribute[] =
484
509
  elementEvents[eventName] || [];
@@ -488,16 +513,25 @@ export class DOMUtilsEvent {
488
513
  for (let index = 0; index < handlers.length; index++) {
489
514
  let handler = handlers[index];
490
515
  let flag = false;
491
- if (!_selector_ || handler.selector === _selector_) {
492
- /* selector不为空,进行selector判断 */
516
+ if (!selectorList.length) {
517
+ // selectorList是空的,默认移除
493
518
  flag = true;
519
+ } else {
520
+ if (
521
+ Array.isArray(handler.selector) &&
522
+ JSON.stringify(handler.selector) === JSON.stringify(selectorList)
523
+ ) {
524
+ // 元素上的selectorList不为空且和传入的相同
525
+ flag = true;
526
+ }
494
527
  }
528
+
495
529
  if (
496
530
  !_callback_ ||
497
531
  handler.callback === _callback_ ||
498
532
  handler.originCallBack === _callback_
499
533
  ) {
500
- /* callback不为空,进行callback判断 */
534
+ /* callback不为空,且callback相同 */
501
535
  flag = true;
502
536
  }
503
537
 
@@ -515,7 +549,8 @@ export class DOMUtilsEvent {
515
549
  DOMUtilsCommonUtils.delete(elementEvents, eventType);
516
550
  }
517
551
  });
518
- (elementItem as any)[DOMUtilsData.SymbolEvents] = elementEvents;
552
+ // @ts-ignore
553
+ elementItem[DOMUtilsData.SymbolEvents] = elementEvents;
519
554
  });
520
555
  }
521
556
  /**
@@ -572,7 +607,8 @@ export class DOMUtilsEvent {
572
607
  ? eventTypeList
573
608
  : Object.keys(elementEvents);
574
609
  iterEventNameList.forEach((eventName) => {
575
- let handlers = elementEvents[eventName];
610
+ let handlers: DOMUtilsEventListenerOptionsAttribute[] =
611
+ elementEvents[eventName];
576
612
  if (!handlers) {
577
613
  return;
578
614
  }
@@ -581,10 +617,8 @@ export class DOMUtilsEvent {
581
617
  capture: handler["option"]["capture"],
582
618
  });
583
619
  }
584
- DOMUtilsCommonUtils.delete(
585
- (elementItem as any)[symbolEvents],
586
- eventName
587
- );
620
+ // @ts-ignore
621
+ DOMUtilsCommonUtils.delete(elementItem[symbolEvents], eventName);
588
622
  });
589
623
  });
590
624
  });
@@ -698,7 +732,7 @@ export class DOMUtilsEvent {
698
732
  * @param element 需要触发的元素|元素数组|window
699
733
  * @param eventType 需要触发的事件
700
734
  * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
701
- * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
735
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
702
736
  * @example
703
737
  * // 触发元素a.xx的click事件
704
738
  * DOMUtils.trigger(document.querySelector("a.xx"),"click")
@@ -1230,6 +1264,9 @@ export class DOMUtilsEvent {
1230
1264
  * @example
1231
1265
  * DOMUtils.selectorAll("div:regexp('^xxxx$')")
1232
1266
  * > [div.xxx]
1267
+ * @example
1268
+ * DOMUtils.selectorAll("div:regexp(/^xxx/ig)")
1269
+ * > [div.xxx]
1233
1270
  */
1234
1271
  selectorAll<K extends keyof HTMLElementTagNameMap>(
1235
1272
  selector: K
@@ -1247,8 +1284,8 @@ export class DOMUtilsEvent {
1247
1284
  return $ele?.innerHTML?.trim() === "";
1248
1285
  });
1249
1286
  } else if (
1250
- selector.match(/[^\s]{1}:contains\("(.*)"\)$/gi) ||
1251
- selector.match(/[^\s]{1}:contains\('(.*)'\)$/gi)
1287
+ selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
1288
+ selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)
1252
1289
  ) {
1253
1290
  // contains 语法
1254
1291
  let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
@@ -1261,13 +1298,19 @@ export class DOMUtilsEvent {
1261
1298
  return ($ele?.textContent || $ele?.innerText)?.includes(text);
1262
1299
  });
1263
1300
  } else if (
1264
- selector.match(/[^\s]{1}:regexp\("(.*)"\)$/gi) ||
1265
- selector.match(/[^\s]{1}:regexp\('(.*)'\)$/gi)
1301
+ selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
1302
+ selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)
1266
1303
  ) {
1267
1304
  // regexp 语法
1268
1305
  let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1269
- let text = textMatch![2];
1270
- let regexp = new RegExp(text);
1306
+ let pattern = textMatch![2];
1307
+ let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1308
+ let flags = "";
1309
+ if (flagMatch) {
1310
+ pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1311
+ flags = flagMatch[3];
1312
+ }
1313
+ let regexp = new RegExp(pattern, flags);
1271
1314
  selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1272
1315
  return Array.from(
1273
1316
  context.windowApi.document.querySelectorAll<E>(selector)
@@ -205,9 +205,9 @@ export declare type DOMUtils_EventType = keyof DOMUtils_Event;
205
205
  */
206
206
  export declare interface DOMUtilsEventListenerOptionsAttribute {
207
207
  /**
208
- * 自定义的ownCallBack
208
+ * DOMUtils的ownCallBack,元素上的监听事件就是它,移除事件时也需要传入这个函数
209
209
  */
210
- callback: () => void;
210
+ callback: (event: Event) => void;
211
211
  /**
212
212
  * 属性配置
213
213
  */
@@ -215,11 +215,11 @@ export declare interface DOMUtilsEventListenerOptionsAttribute {
215
215
  /**
216
216
  * 用户添加的事件
217
217
  */
218
- originCallBack: () => void;
218
+ originCallBack: (event: Event) => void;
219
219
  /**
220
220
  * 子元素选择器
221
221
  */
222
- selector?: string;
222
+ selector?: string[];
223
223
  }
224
224
 
225
225
  export declare type DOMUtilsElementEventType =