@whitesev/domutils 1.7.0 → 1.7.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.
- package/dist/index.amd.js +46 -27
- package/dist/index.amd.js.map +1 -1
- package/dist/index.amd.min.js +1 -1
- package/dist/index.amd.min.js.map +1 -1
- package/dist/index.cjs.js +46 -27
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.cjs.min.js +1 -1
- package/dist/index.cjs.min.js.map +1 -1
- package/dist/index.esm.js +46 -27
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/index.iife.js +46 -27
- package/dist/index.iife.js.map +1 -1
- package/dist/index.iife.min.js +1 -1
- package/dist/index.iife.min.js.map +1 -1
- package/dist/index.system.js +46 -27
- package/dist/index.system.js.map +1 -1
- package/dist/index.system.min.js +1 -1
- package/dist/index.system.min.js.map +1 -1
- package/dist/index.umd.js +46 -27
- package/dist/index.umd.js.map +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/dist/types/src/ElementEvent.d.ts +9 -9
- package/dist/types/src/types/DOMUtilsEvent.d.ts +23 -0
- package/package.json +11 -14
- package/src/ElementEvent.ts +68 -49
- package/src/types/DOMUtilsEvent.d.ts +23 -0
package/src/ElementEvent.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { OriginPrototype } from "./OriginPrototype";
|
|
|
5
5
|
import type {
|
|
6
6
|
DOMUtils_Event,
|
|
7
7
|
DOMUtils_EventType,
|
|
8
|
+
DOMUtilsAddEventListenerResult,
|
|
8
9
|
DOMUtilsElementEventType,
|
|
9
10
|
DOMUtilsEventListenerOption,
|
|
10
11
|
DOMUtilsEventListenerOptionsAttribute,
|
|
@@ -50,7 +51,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
50
51
|
eventType: T | T[],
|
|
51
52
|
callback: (this: HTMLElement, event: DOMUtils_Event[T]) => void,
|
|
52
53
|
option?: DOMUtilsEventListenerOption | boolean
|
|
53
|
-
):
|
|
54
|
+
): DOMUtilsAddEventListenerResult;
|
|
54
55
|
/**
|
|
55
56
|
* 绑定事件
|
|
56
57
|
* @param element 需要绑定的元素|元素数组|window
|
|
@@ -74,7 +75,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
74
75
|
eventType: string | string[],
|
|
75
76
|
callback: (this: HTMLElement, event: T) => void,
|
|
76
77
|
option?: DOMUtilsEventListenerOption | boolean
|
|
77
|
-
):
|
|
78
|
+
): DOMUtilsAddEventListenerResult;
|
|
78
79
|
/**
|
|
79
80
|
* 绑定事件
|
|
80
81
|
* @param element 需要绑定的元素|元素数组|window
|
|
@@ -105,7 +106,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
105
106
|
selector: string | string[] | undefined | null,
|
|
106
107
|
callback: (this: HTMLElement, event: DOMUtils_Event[T], selectorTarget: HTMLElement) => void,
|
|
107
108
|
option?: DOMUtilsEventListenerOption | boolean
|
|
108
|
-
):
|
|
109
|
+
): DOMUtilsAddEventListenerResult;
|
|
109
110
|
/**
|
|
110
111
|
* 绑定事件
|
|
111
112
|
* @param element 需要绑定的元素|元素数组|window
|
|
@@ -136,7 +137,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
136
137
|
selector: string | string[] | undefined | null,
|
|
137
138
|
callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void,
|
|
138
139
|
option?: DOMUtilsEventListenerOption | boolean
|
|
139
|
-
):
|
|
140
|
+
): DOMUtilsAddEventListenerResult;
|
|
140
141
|
on<T extends Event>(
|
|
141
142
|
element: HTMLElement | string | NodeList | HTMLElement[] | Window | Document | Element | null | typeof globalThis,
|
|
142
143
|
eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
|
|
@@ -151,7 +152,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
151
152
|
| DOMUtilsEventListenerOption
|
|
152
153
|
| boolean,
|
|
153
154
|
option?: DOMUtilsEventListenerOption | boolean
|
|
154
|
-
) {
|
|
155
|
+
): DOMUtilsAddEventListenerResult {
|
|
155
156
|
/**
|
|
156
157
|
* 获取option配置
|
|
157
158
|
* @param args
|
|
@@ -190,30 +191,28 @@ class ElementEvent extends ElementAnimate {
|
|
|
190
191
|
element = that.selectorAll(element);
|
|
191
192
|
}
|
|
192
193
|
if (element == null) {
|
|
193
|
-
return
|
|
194
|
+
return {
|
|
195
|
+
off() {},
|
|
196
|
+
trigger() {},
|
|
197
|
+
};
|
|
194
198
|
}
|
|
195
|
-
let
|
|
199
|
+
let $elList: (Element | Document | Window)[] = [];
|
|
196
200
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
197
|
-
|
|
198
|
-
elementList = [...element];
|
|
201
|
+
$elList = $elList.concat(Array.from(element as Element[]));
|
|
199
202
|
} else {
|
|
200
|
-
|
|
203
|
+
$elList.push(element as Element);
|
|
201
204
|
}
|
|
202
205
|
// 事件名
|
|
203
206
|
let eventTypeList: string[] = [];
|
|
204
207
|
if (Array.isArray(eventType)) {
|
|
205
|
-
eventTypeList = eventTypeList.concat(
|
|
206
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
207
|
-
);
|
|
208
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
208
209
|
} else if (typeof eventType === "string") {
|
|
209
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
210
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
210
211
|
}
|
|
211
212
|
// 子元素选择器
|
|
212
213
|
let selectorList: string[] = [];
|
|
213
214
|
if (Array.isArray(selector)) {
|
|
214
|
-
selectorList = selectorList.concat(
|
|
215
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
216
|
-
);
|
|
215
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
217
216
|
} else if (typeof selector === "string") {
|
|
218
217
|
selectorList.push(selector);
|
|
219
218
|
}
|
|
@@ -243,7 +242,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
243
242
|
that.off(element, eventType as any, selector as any, callback as any, option);
|
|
244
243
|
}
|
|
245
244
|
}
|
|
246
|
-
|
|
245
|
+
$elList.forEach((elementItem) => {
|
|
247
246
|
/**
|
|
248
247
|
* 事件回调
|
|
249
248
|
* @param event
|
|
@@ -269,7 +268,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
269
268
|
}
|
|
270
269
|
/* 在上层与主元素之间寻找可以被selector所匹配到的 */
|
|
271
270
|
const $closestMatches = that.closest<HTMLElement>(eventTarget, selectorItem);
|
|
272
|
-
if ($closestMatches && totalParent?.contains($closestMatches)) {
|
|
271
|
+
if ($closestMatches && (<HTMLElement>totalParent)?.contains?.($closestMatches)) {
|
|
273
272
|
eventTarget = $closestMatches;
|
|
274
273
|
return true;
|
|
275
274
|
}
|
|
@@ -291,7 +290,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
291
290
|
}
|
|
292
291
|
} else {
|
|
293
292
|
// 这时候的this指向监听的元素
|
|
294
|
-
listenerCallBack.call(elementItem, event as any);
|
|
293
|
+
listenerCallBack.call(elementItem as HTMLElement, event as any);
|
|
295
294
|
checkOptionOnceToRemoveEventListener();
|
|
296
295
|
}
|
|
297
296
|
}
|
|
@@ -315,6 +314,30 @@ class ElementEvent extends ElementAnimate {
|
|
|
315
314
|
Reflect.set(elementItem, GlobalData.domEventSymbol, elementEvents);
|
|
316
315
|
});
|
|
317
316
|
});
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
/**
|
|
320
|
+
* 取消绑定的监听事件
|
|
321
|
+
* @param filter (可选)过滤函数,对元素属性上的事件进行过滤出想要删除的事件
|
|
322
|
+
*/
|
|
323
|
+
off: (
|
|
324
|
+
filter?: (
|
|
325
|
+
value: DOMUtilsEventListenerOptionsAttribute,
|
|
326
|
+
index: number,
|
|
327
|
+
array: DOMUtilsEventListenerOptionsAttribute[]
|
|
328
|
+
) => boolean
|
|
329
|
+
) => {
|
|
330
|
+
that.off($elList, eventTypeList, selectorList, listenerCallBack, listenerOption, filter);
|
|
331
|
+
},
|
|
332
|
+
/**
|
|
333
|
+
* 主动触发事件
|
|
334
|
+
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
335
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
|
|
336
|
+
*/
|
|
337
|
+
trigger: (details?: object, useDispatchToTriggerEvent?: boolean) => {
|
|
338
|
+
that.trigger($elList, eventTypeList, details, useDispatchToTriggerEvent);
|
|
339
|
+
},
|
|
340
|
+
};
|
|
318
341
|
}
|
|
319
342
|
/**
|
|
320
343
|
* 取消绑定事件
|
|
@@ -467,24 +490,20 @@ class ElementEvent extends ElementAnimate {
|
|
|
467
490
|
let $elList: HTMLElement[] = [];
|
|
468
491
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
469
492
|
element = element as HTMLElement[];
|
|
470
|
-
$elList =
|
|
493
|
+
$elList = $elList.concat(Array.from(element));
|
|
471
494
|
} else {
|
|
472
495
|
$elList.push(element as HTMLElement);
|
|
473
496
|
}
|
|
474
497
|
let eventTypeList: string[] = [];
|
|
475
498
|
if (Array.isArray(eventType)) {
|
|
476
|
-
eventTypeList = eventTypeList.concat(
|
|
477
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
478
|
-
);
|
|
499
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
479
500
|
} else if (typeof eventType === "string") {
|
|
480
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
501
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
481
502
|
}
|
|
482
503
|
// 子元素选择器
|
|
483
504
|
let selectorList: string[] = [];
|
|
484
505
|
if (Array.isArray(selector)) {
|
|
485
|
-
selectorList = selectorList.concat(
|
|
486
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
487
|
-
);
|
|
506
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
488
507
|
} else if (typeof selector === "string") {
|
|
489
508
|
selectorList.push(selector);
|
|
490
509
|
}
|
|
@@ -595,11 +614,11 @@ class ElementEvent extends ElementAnimate {
|
|
|
595
614
|
if (element == null) {
|
|
596
615
|
return;
|
|
597
616
|
}
|
|
598
|
-
let $elList:
|
|
617
|
+
let $elList: (Element | Document | Window | typeof globalThis | Node | ChildNode | EventTarget)[] = [];
|
|
599
618
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
600
|
-
$elList =
|
|
619
|
+
$elList = $elList.concat(Array.from(element as HTMLElement[]));
|
|
601
620
|
} else {
|
|
602
|
-
$elList.push(element
|
|
621
|
+
$elList.push(element);
|
|
603
622
|
}
|
|
604
623
|
|
|
605
624
|
let eventTypeList: string[] = [];
|
|
@@ -706,7 +725,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
706
725
|
}
|
|
707
726
|
if (checkDOMReadyState()) {
|
|
708
727
|
/* 检查document状态 */
|
|
709
|
-
CommonUtils.setTimeout(callback);
|
|
728
|
+
CommonUtils.setTimeout(callback, 0);
|
|
710
729
|
} else {
|
|
711
730
|
/* 添加监听 */
|
|
712
731
|
addDomReadyListener();
|
|
@@ -717,7 +736,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
717
736
|
* @param element 需要触发的元素|元素数组|window
|
|
718
737
|
* @param eventType 需要触发的事件
|
|
719
738
|
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
720
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent
|
|
739
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
|
|
721
740
|
* @example
|
|
722
741
|
* // 触发元素a.xx的click事件
|
|
723
742
|
* DOMUtils.trigger(document.querySelector("a.xx"),"click")
|
|
@@ -728,7 +747,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
728
747
|
*/
|
|
729
748
|
trigger(
|
|
730
749
|
element: DOMUtilsTargetElementType | Element | DocumentFragment | any[] | typeof globalThis | Window | Document,
|
|
731
|
-
eventType: string,
|
|
750
|
+
eventType: string | string[],
|
|
732
751
|
details?: object,
|
|
733
752
|
useDispatchToTriggerEvent?: boolean
|
|
734
753
|
): void;
|
|
@@ -737,7 +756,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
737
756
|
* @param element 需要触发的元素|元素数组|window
|
|
738
757
|
* @param eventType 需要触发的事件
|
|
739
758
|
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
740
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
|
|
759
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
|
|
741
760
|
* @example
|
|
742
761
|
* // 触发元素a.xx的click事件
|
|
743
762
|
* DOMUtils.trigger(document.querySelector("a.xx"),"click")
|
|
@@ -747,7 +766,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
747
766
|
* DOMUtils.trigger("a.xx",["click","tap","hover"])
|
|
748
767
|
*/
|
|
749
768
|
trigger(
|
|
750
|
-
element:
|
|
769
|
+
element: Element | string | NodeList | any[] | Window | Document,
|
|
751
770
|
eventType: DOMUtils_EventType | DOMUtils_EventType[],
|
|
752
771
|
details?: object,
|
|
753
772
|
useDispatchToTriggerEvent?: boolean
|
|
@@ -757,7 +776,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
757
776
|
* @param element 需要触发的元素|元素数组|window
|
|
758
777
|
* @param eventType 需要触发的事件
|
|
759
778
|
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
760
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
|
|
779
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
|
|
761
780
|
* @example
|
|
762
781
|
* // 触发元素a.xx的click事件
|
|
763
782
|
* DOMUtils.trigger(document.querySelector("a.xx"),"click")
|
|
@@ -767,8 +786,8 @@ class ElementEvent extends ElementAnimate {
|
|
|
767
786
|
* DOMUtils.trigger("a.xx",["click","tap","hover"])
|
|
768
787
|
*/
|
|
769
788
|
trigger(
|
|
770
|
-
element:
|
|
771
|
-
eventType: DOMUtils_EventType | DOMUtils_EventType[] | string,
|
|
789
|
+
element: Element | string | NodeList | any[] | Window | Document,
|
|
790
|
+
eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
|
|
772
791
|
details?: object,
|
|
773
792
|
useDispatchToTriggerEvent: boolean = true
|
|
774
793
|
) {
|
|
@@ -779,16 +798,15 @@ class ElementEvent extends ElementAnimate {
|
|
|
779
798
|
if (element == null) {
|
|
780
799
|
return;
|
|
781
800
|
}
|
|
782
|
-
let $elList = [];
|
|
801
|
+
let $elList: (Document | Window | Element)[] = [];
|
|
783
802
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
784
|
-
|
|
785
|
-
$elList = [...element];
|
|
803
|
+
$elList = $elList.concat(Array.from(element));
|
|
786
804
|
} else {
|
|
787
|
-
$elList
|
|
805
|
+
$elList.push(element);
|
|
788
806
|
}
|
|
789
807
|
let eventTypeList: string[] = [];
|
|
790
808
|
if (Array.isArray(eventType)) {
|
|
791
|
-
eventTypeList = eventType
|
|
809
|
+
eventTypeList = eventType.filter((it) => typeof it === "string" && it.trim() !== "");
|
|
792
810
|
} else if (typeof eventType === "string") {
|
|
793
811
|
eventTypeList = eventType.split(" ");
|
|
794
812
|
}
|
|
@@ -798,24 +816,25 @@ class ElementEvent extends ElementAnimate {
|
|
|
798
816
|
const elementEvents: {
|
|
799
817
|
[key: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
800
818
|
} = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
|
|
801
|
-
eventTypeList.forEach((
|
|
819
|
+
eventTypeList.forEach((eventTypeItem) => {
|
|
802
820
|
let event: Event = null as any;
|
|
803
821
|
if (details && details instanceof Event) {
|
|
804
822
|
event = details;
|
|
805
823
|
} else {
|
|
806
824
|
// 构造事件
|
|
807
|
-
event = new Event(
|
|
825
|
+
event = new Event(eventTypeItem);
|
|
808
826
|
if (details) {
|
|
809
|
-
Object.keys(details)
|
|
827
|
+
const detailKeys = Object.keys(details);
|
|
828
|
+
detailKeys.forEach((keyName) => {
|
|
810
829
|
const value = Reflect.get(details, keyName);
|
|
811
830
|
// 在event上添加属性
|
|
812
831
|
Reflect.set(event, keyName, value);
|
|
813
832
|
});
|
|
814
833
|
}
|
|
815
834
|
}
|
|
816
|
-
if (useDispatchToTriggerEvent == false &&
|
|
835
|
+
if (useDispatchToTriggerEvent == false && eventTypeItem in elementEvents) {
|
|
817
836
|
// 直接调用监听的事件
|
|
818
|
-
elementEvents[
|
|
837
|
+
elementEvents[eventTypeItem].forEach((eventsItem: any) => {
|
|
819
838
|
eventsItem.callback(event);
|
|
820
839
|
});
|
|
821
840
|
} else {
|
|
@@ -249,3 +249,26 @@ export declare type DOMUtilsElementEventType =
|
|
|
249
249
|
| ChildNode
|
|
250
250
|
| Node
|
|
251
251
|
| DocumentFragment;
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* 通过.on执行后的返回值
|
|
255
|
+
*/
|
|
256
|
+
export declare interface DOMUtilsAddEventListenerResult {
|
|
257
|
+
/**
|
|
258
|
+
* 取消绑定的监听事件
|
|
259
|
+
* @param filter (可选)过滤函数,对元素属性上的事件进行过滤出想要删除的事件
|
|
260
|
+
*/
|
|
261
|
+
off(
|
|
262
|
+
filter?: (
|
|
263
|
+
value: DOMUtilsEventListenerOptionsAttribute,
|
|
264
|
+
index: number,
|
|
265
|
+
array: DOMUtilsEventListenerOptionsAttribute[]
|
|
266
|
+
) => boolean
|
|
267
|
+
): void;
|
|
268
|
+
/**
|
|
269
|
+
* 主动触发事件
|
|
270
|
+
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
271
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
|
|
272
|
+
*/
|
|
273
|
+
trigger(details?: object, useDispatchToTriggerEvent?: boolean): void;
|
|
274
|
+
}
|