@whitesev/domutils 1.6.8 → 1.7.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.
- package/dist/index.amd.js +1962 -1062
- package/dist/index.amd.js.map +1 -1
- package/dist/index.amd.min.js +2 -0
- package/dist/index.amd.min.js.map +1 -0
- package/dist/index.cjs.js +1962 -1062
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.cjs.min.js +2 -0
- package/dist/index.cjs.min.js.map +1 -0
- package/dist/index.esm.js +1962 -1062
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +2 -0
- package/dist/index.esm.min.js.map +1 -0
- package/dist/index.iife.js +1962 -1062
- package/dist/index.iife.js.map +1 -1
- package/dist/index.iife.min.js +2 -0
- package/dist/index.iife.min.js.map +1 -0
- package/dist/index.system.js +1962 -1062
- package/dist/index.system.js.map +1 -1
- package/dist/index.system.min.js +2 -0
- package/dist/index.system.min.js.map +1 -0
- package/dist/index.umd.js +1962 -1062
- package/dist/index.umd.js.map +1 -1
- package/dist/index.umd.min.js +2 -0
- package/dist/index.umd.min.js.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/src/{DOMUtilsCommonUtils.d.ts → CommonUtils.d.ts} +20 -8
- package/dist/types/src/ElementAnimate.d.ts +89 -0
- package/dist/types/src/{DOMUtilsEvent.d.ts → ElementEvent.d.ts} +27 -92
- package/dist/types/src/ElementHandler.d.ts +17 -0
- package/dist/types/src/ElementSelector.d.ts +96 -0
- package/dist/types/src/ElementWait.d.ts +278 -0
- package/dist/types/src/GlobalData.d.ts +4 -0
- package/dist/types/src/{DOMUtilsOriginPrototype.d.ts → OriginPrototype.d.ts} +1 -2
- package/dist/types/src/Utils.d.ts +68 -0
- package/dist/types/src/{DOMUtils.d.ts → index.d.ts} +157 -177
- package/dist/types/src/types/DOMUtilsEvent.d.ts +23 -0
- package/dist/types/src/types/env.d.ts +9 -0
- package/dist/types/src/types/global.d.ts +0 -2
- package/dist/types/src/types/gm.d.ts +0 -4
- package/index.ts +1 -1
- package/package.json +13 -12
- package/src/{DOMUtilsCommonUtils.ts → CommonUtils.ts} +25 -11
- package/src/ElementAnimate.ts +290 -0
- package/src/{DOMUtilsEvent.ts → ElementEvent.ts} +220 -396
- package/src/ElementHandler.ts +43 -0
- package/src/ElementSelector.ts +260 -0
- package/src/ElementWait.ts +699 -0
- package/src/GlobalData.ts +5 -0
- package/src/{DOMUtilsOriginPrototype.ts → OriginPrototype.ts} +1 -3
- package/src/Utils.ts +386 -0
- package/src/{DOMUtils.ts → index.ts} +678 -757
- package/src/types/DOMUtilsEvent.d.ts +23 -0
- package/src/types/env.d.ts +9 -0
- package/src/types/global.d.ts +0 -2
- package/src/types/gm.d.ts +0 -4
- package/dist/types/src/DOMUtilsData.d.ts +0 -5
- package/src/DOMUtilsData.ts +0 -7
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { CommonUtils } from "./CommonUtils";
|
|
2
|
+
import { GlobalData } from "./GlobalData";
|
|
3
|
+
import { ElementAnimate } from "./ElementAnimate";
|
|
4
|
+
import { OriginPrototype } from "./OriginPrototype";
|
|
4
5
|
import type {
|
|
5
6
|
DOMUtils_Event,
|
|
6
7
|
DOMUtils_EventType,
|
|
8
|
+
DOMUtilsAddEventListenerResult,
|
|
7
9
|
DOMUtilsElementEventType,
|
|
8
10
|
DOMUtilsEventListenerOption,
|
|
9
11
|
DOMUtilsEventListenerOptionsAttribute,
|
|
@@ -12,11 +14,20 @@ import type { DOMUtilsTargetElementType } from "./types/global";
|
|
|
12
14
|
import type { WindowApiOption } from "./types/WindowApi";
|
|
13
15
|
import { WindowApi } from "./WindowApi";
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
class ElementEvent extends ElementAnimate {
|
|
16
18
|
windowApi: typeof WindowApi.prototype;
|
|
17
19
|
constructor(windowApiOption?: WindowApiOption) {
|
|
20
|
+
super(windowApiOption);
|
|
18
21
|
this.windowApi = new WindowApi(windowApiOption);
|
|
19
22
|
}
|
|
23
|
+
/** 获取 animationend 在各个浏览器的兼容名 */
|
|
24
|
+
getAnimationEndNameList() {
|
|
25
|
+
return CommonUtils.getAnimationEndNameList();
|
|
26
|
+
}
|
|
27
|
+
/** 获取 transitionend 在各个浏览器的兼容名 */
|
|
28
|
+
getTransitionEndNameList() {
|
|
29
|
+
return CommonUtils.getTransitionEndNameList();
|
|
30
|
+
}
|
|
20
31
|
/**
|
|
21
32
|
* 绑定事件
|
|
22
33
|
* @param element 需要绑定的元素|元素数组|window
|
|
@@ -40,7 +51,7 @@ export class DOMUtilsEvent {
|
|
|
40
51
|
eventType: T | T[],
|
|
41
52
|
callback: (this: HTMLElement, event: DOMUtils_Event[T]) => void,
|
|
42
53
|
option?: DOMUtilsEventListenerOption | boolean
|
|
43
|
-
):
|
|
54
|
+
): DOMUtilsAddEventListenerResult;
|
|
44
55
|
/**
|
|
45
56
|
* 绑定事件
|
|
46
57
|
* @param element 需要绑定的元素|元素数组|window
|
|
@@ -64,7 +75,7 @@ export class DOMUtilsEvent {
|
|
|
64
75
|
eventType: string | string[],
|
|
65
76
|
callback: (this: HTMLElement, event: T) => void,
|
|
66
77
|
option?: DOMUtilsEventListenerOption | boolean
|
|
67
|
-
):
|
|
78
|
+
): DOMUtilsAddEventListenerResult;
|
|
68
79
|
/**
|
|
69
80
|
* 绑定事件
|
|
70
81
|
* @param element 需要绑定的元素|元素数组|window
|
|
@@ -95,7 +106,7 @@ export class DOMUtilsEvent {
|
|
|
95
106
|
selector: string | string[] | undefined | null,
|
|
96
107
|
callback: (this: HTMLElement, event: DOMUtils_Event[T], selectorTarget: HTMLElement) => void,
|
|
97
108
|
option?: DOMUtilsEventListenerOption | boolean
|
|
98
|
-
):
|
|
109
|
+
): DOMUtilsAddEventListenerResult;
|
|
99
110
|
/**
|
|
100
111
|
* 绑定事件
|
|
101
112
|
* @param element 需要绑定的元素|元素数组|window
|
|
@@ -126,7 +137,7 @@ export class DOMUtilsEvent {
|
|
|
126
137
|
selector: string | string[] | undefined | null,
|
|
127
138
|
callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void,
|
|
128
139
|
option?: DOMUtilsEventListenerOption | boolean
|
|
129
|
-
):
|
|
140
|
+
): DOMUtilsAddEventListenerResult;
|
|
130
141
|
on<T extends Event>(
|
|
131
142
|
element: HTMLElement | string | NodeList | HTMLElement[] | Window | Document | Element | null | typeof globalThis,
|
|
132
143
|
eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
|
|
@@ -141,7 +152,7 @@ export class DOMUtilsEvent {
|
|
|
141
152
|
| DOMUtilsEventListenerOption
|
|
142
153
|
| boolean,
|
|
143
154
|
option?: DOMUtilsEventListenerOption | boolean
|
|
144
|
-
) {
|
|
155
|
+
): DOMUtilsAddEventListenerResult {
|
|
145
156
|
/**
|
|
146
157
|
* 获取option配置
|
|
147
158
|
* @param args
|
|
@@ -173,37 +184,35 @@ export class DOMUtilsEvent {
|
|
|
173
184
|
return option;
|
|
174
185
|
}
|
|
175
186
|
|
|
176
|
-
const
|
|
187
|
+
const that = this;
|
|
177
188
|
// eslint-disable-next-line prefer-rest-params
|
|
178
189
|
const args = arguments;
|
|
179
190
|
if (typeof element === "string") {
|
|
180
|
-
element =
|
|
191
|
+
element = that.selectorAll(element);
|
|
181
192
|
}
|
|
182
193
|
if (element == null) {
|
|
183
|
-
return
|
|
194
|
+
return {
|
|
195
|
+
off() {},
|
|
196
|
+
trigger() {},
|
|
197
|
+
};
|
|
184
198
|
}
|
|
185
|
-
let
|
|
199
|
+
let $elList: (Element | Document | Window)[] = [];
|
|
186
200
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
187
|
-
|
|
188
|
-
elementList = [...element];
|
|
201
|
+
$elList = $elList.concat(Array.from(element as Element[]));
|
|
189
202
|
} else {
|
|
190
|
-
|
|
203
|
+
$elList.push(element as Element);
|
|
191
204
|
}
|
|
192
205
|
// 事件名
|
|
193
206
|
let eventTypeList: string[] = [];
|
|
194
207
|
if (Array.isArray(eventType)) {
|
|
195
|
-
eventTypeList = eventTypeList.concat(
|
|
196
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
197
|
-
);
|
|
208
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
198
209
|
} else if (typeof eventType === "string") {
|
|
199
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
210
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
200
211
|
}
|
|
201
212
|
// 子元素选择器
|
|
202
213
|
let selectorList: string[] = [];
|
|
203
214
|
if (Array.isArray(selector)) {
|
|
204
|
-
selectorList = selectorList.concat(
|
|
205
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
206
|
-
);
|
|
215
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
207
216
|
} else if (typeof selector === "string") {
|
|
208
217
|
selectorList.push(selector);
|
|
209
218
|
}
|
|
@@ -230,10 +239,10 @@ export class DOMUtilsEvent {
|
|
|
230
239
|
*/
|
|
231
240
|
function checkOptionOnceToRemoveEventListener() {
|
|
232
241
|
if (listenerOption.once) {
|
|
233
|
-
|
|
242
|
+
that.off(element, eventType as any, selector as any, callback as any, option);
|
|
234
243
|
}
|
|
235
244
|
}
|
|
236
|
-
|
|
245
|
+
$elList.forEach((elementItem) => {
|
|
237
246
|
/**
|
|
238
247
|
* 事件回调
|
|
239
248
|
* @param event
|
|
@@ -246,20 +255,20 @@ export class DOMUtilsEvent {
|
|
|
246
255
|
? (event.composedPath()[0] as HTMLElement)
|
|
247
256
|
: (event.target as HTMLElement);
|
|
248
257
|
let totalParent = elementItem;
|
|
249
|
-
if (
|
|
250
|
-
if (totalParent === (
|
|
251
|
-
totalParent =
|
|
258
|
+
if (CommonUtils.isWin(totalParent)) {
|
|
259
|
+
if (totalParent === (that.windowApi.document as any as HTMLElement)) {
|
|
260
|
+
totalParent = that.windowApi.document.documentElement;
|
|
252
261
|
}
|
|
253
262
|
}
|
|
254
263
|
const findValue = selectorList.find((selectorItem) => {
|
|
255
264
|
// 判断目标元素是否匹配选择器
|
|
256
|
-
if (
|
|
265
|
+
if (that.matches(eventTarget, selectorItem)) {
|
|
257
266
|
/* 当前目标可以被selector所匹配到 */
|
|
258
267
|
return true;
|
|
259
268
|
}
|
|
260
269
|
/* 在上层与主元素之间寻找可以被selector所匹配到的 */
|
|
261
|
-
const $closestMatches =
|
|
262
|
-
if ($closestMatches && totalParent?.contains($closestMatches)) {
|
|
270
|
+
const $closestMatches = that.closest<HTMLElement>(eventTarget, selectorItem);
|
|
271
|
+
if ($closestMatches && (<HTMLElement>totalParent)?.contains?.($closestMatches)) {
|
|
263
272
|
eventTarget = $closestMatches;
|
|
264
273
|
return true;
|
|
265
274
|
}
|
|
@@ -281,7 +290,7 @@ export class DOMUtilsEvent {
|
|
|
281
290
|
}
|
|
282
291
|
} else {
|
|
283
292
|
// 这时候的this指向监听的元素
|
|
284
|
-
listenerCallBack.call(elementItem, event as any);
|
|
293
|
+
listenerCallBack.call(elementItem as HTMLElement, event as any);
|
|
285
294
|
checkOptionOnceToRemoveEventListener();
|
|
286
295
|
}
|
|
287
296
|
}
|
|
@@ -292,7 +301,7 @@ export class DOMUtilsEvent {
|
|
|
292
301
|
/* 获取对象上的事件 */
|
|
293
302
|
const elementEvents: {
|
|
294
303
|
[k: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
295
|
-
} = Reflect.get(elementItem,
|
|
304
|
+
} = Reflect.get(elementItem, GlobalData.domEventSymbol) || {};
|
|
296
305
|
/* 初始化对象上的xx事件 */
|
|
297
306
|
elementEvents[eventName] = elementEvents[eventName] || [];
|
|
298
307
|
elementEvents[eventName].push({
|
|
@@ -302,9 +311,33 @@ export class DOMUtilsEvent {
|
|
|
302
311
|
originCallBack: listenerCallBack,
|
|
303
312
|
});
|
|
304
313
|
/* 覆盖事件 */
|
|
305
|
-
Reflect.set(elementItem,
|
|
314
|
+
Reflect.set(elementItem, GlobalData.domEventSymbol, elementEvents);
|
|
306
315
|
});
|
|
307
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
|
+
};
|
|
308
341
|
}
|
|
309
342
|
/**
|
|
310
343
|
* 取消绑定事件
|
|
@@ -445,36 +478,32 @@ export class DOMUtilsEvent {
|
|
|
445
478
|
}
|
|
446
479
|
return option;
|
|
447
480
|
}
|
|
448
|
-
const
|
|
481
|
+
const that = this;
|
|
449
482
|
// eslint-disable-next-line prefer-rest-params
|
|
450
483
|
const args = arguments;
|
|
451
484
|
if (typeof element === "string") {
|
|
452
|
-
element =
|
|
485
|
+
element = that.selectorAll(element);
|
|
453
486
|
}
|
|
454
487
|
if (element == null) {
|
|
455
488
|
return;
|
|
456
489
|
}
|
|
457
|
-
let
|
|
490
|
+
let $elList: HTMLElement[] = [];
|
|
458
491
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
459
492
|
element = element as HTMLElement[];
|
|
460
|
-
|
|
493
|
+
$elList = $elList.concat(Array.from(element));
|
|
461
494
|
} else {
|
|
462
|
-
|
|
495
|
+
$elList.push(element as HTMLElement);
|
|
463
496
|
}
|
|
464
497
|
let eventTypeList: string[] = [];
|
|
465
498
|
if (Array.isArray(eventType)) {
|
|
466
|
-
eventTypeList = eventTypeList.concat(
|
|
467
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
468
|
-
);
|
|
499
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
469
500
|
} else if (typeof eventType === "string") {
|
|
470
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
501
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
471
502
|
}
|
|
472
503
|
// 子元素选择器
|
|
473
504
|
let selectorList: string[] = [];
|
|
474
505
|
if (Array.isArray(selector)) {
|
|
475
|
-
selectorList = selectorList.concat(
|
|
476
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
477
|
-
);
|
|
506
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
478
507
|
} else if (typeof selector === "string") {
|
|
479
508
|
selectorList.push(selector);
|
|
480
509
|
}
|
|
@@ -515,11 +544,11 @@ export class DOMUtilsEvent {
|
|
|
515
544
|
array: DOMUtilsEventListenerOptionsAttribute[]
|
|
516
545
|
) => boolean;
|
|
517
546
|
}
|
|
518
|
-
|
|
547
|
+
$elList.forEach(($elItem) => {
|
|
519
548
|
/* 获取对象上的事件 */
|
|
520
549
|
const elementEvents: {
|
|
521
550
|
[key: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
522
|
-
} = Reflect.get(
|
|
551
|
+
} = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
|
|
523
552
|
eventTypeList.forEach((eventName) => {
|
|
524
553
|
const handlers = elementEvents[eventName] || [];
|
|
525
554
|
const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
|
|
@@ -545,7 +574,7 @@ export class DOMUtilsEvent {
|
|
|
545
574
|
flag = false;
|
|
546
575
|
}
|
|
547
576
|
if (flag || isRemoveAll) {
|
|
548
|
-
|
|
577
|
+
$elItem.removeEventListener(eventName, handler.callback, handler.option);
|
|
549
578
|
const findIndex = handlers.findIndex((item) => item === handler);
|
|
550
579
|
if (findIndex !== -1) {
|
|
551
580
|
handlers.splice(findIndex, 1);
|
|
@@ -554,10 +583,10 @@ export class DOMUtilsEvent {
|
|
|
554
583
|
}
|
|
555
584
|
if (handlers.length === 0) {
|
|
556
585
|
/* 如果没有任意的handler,那么删除该属性 */
|
|
557
|
-
|
|
586
|
+
CommonUtils.delete(elementEvents, eventType);
|
|
558
587
|
}
|
|
559
588
|
});
|
|
560
|
-
Reflect.set(
|
|
589
|
+
Reflect.set($elItem, GlobalData.domEventSymbol, elementEvents);
|
|
561
590
|
});
|
|
562
591
|
}
|
|
563
592
|
/**
|
|
@@ -578,18 +607,18 @@ export class DOMUtilsEvent {
|
|
|
578
607
|
* @param eventType (可选)需要取消监听的事件
|
|
579
608
|
*/
|
|
580
609
|
offAll(element: DOMUtilsElementEventType, eventType?: DOMUtils_EventType | DOMUtils_EventType[] | string) {
|
|
581
|
-
const
|
|
610
|
+
const that = this;
|
|
582
611
|
if (typeof element === "string") {
|
|
583
|
-
element =
|
|
612
|
+
element = that.selectorAll(element);
|
|
584
613
|
}
|
|
585
614
|
if (element == null) {
|
|
586
615
|
return;
|
|
587
616
|
}
|
|
588
|
-
let
|
|
617
|
+
let $elList: (Element | Document | Window | typeof globalThis | Node | ChildNode | EventTarget)[] = [];
|
|
589
618
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
590
|
-
|
|
619
|
+
$elList = $elList.concat(Array.from(element as HTMLElement[]));
|
|
591
620
|
} else {
|
|
592
|
-
|
|
621
|
+
$elList.push(element);
|
|
593
622
|
}
|
|
594
623
|
|
|
595
624
|
let eventTypeList: string[] = [];
|
|
@@ -598,12 +627,15 @@ export class DOMUtilsEvent {
|
|
|
598
627
|
} else if (typeof eventType === "string") {
|
|
599
628
|
eventTypeList = eventTypeList.concat(eventType.split(" "));
|
|
600
629
|
}
|
|
601
|
-
|
|
602
|
-
Object.getOwnPropertySymbols(
|
|
603
|
-
|
|
630
|
+
$elList.forEach(($elItem) => {
|
|
631
|
+
const symbolList = [...new Set([...Object.getOwnPropertySymbols($elItem), GlobalData.domEventSymbol])];
|
|
632
|
+
symbolList.forEach((symbolItem) => {
|
|
633
|
+
if (!symbolItem.toString().startsWith("Symbol(events_")) {
|
|
604
634
|
return;
|
|
605
635
|
}
|
|
606
|
-
const elementEvents
|
|
636
|
+
const elementEvents: {
|
|
637
|
+
[key: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
638
|
+
} = Reflect.get($elItem, symbolItem) || {};
|
|
607
639
|
const iterEventNameList = eventTypeList.length ? eventTypeList : Object.keys(elementEvents);
|
|
608
640
|
iterEventNameList.forEach((eventName) => {
|
|
609
641
|
const handlers: DOMUtilsEventListenerOptionsAttribute[] = elementEvents[eventName];
|
|
@@ -611,12 +643,12 @@ export class DOMUtilsEvent {
|
|
|
611
643
|
return;
|
|
612
644
|
}
|
|
613
645
|
for (const handler of handlers) {
|
|
614
|
-
|
|
646
|
+
$elItem.removeEventListener(eventName, handler.callback, {
|
|
615
647
|
capture: handler["option"]["capture"],
|
|
616
648
|
});
|
|
617
649
|
}
|
|
618
|
-
const events = Reflect.get(
|
|
619
|
-
|
|
650
|
+
const events = Reflect.get($elItem, symbolItem);
|
|
651
|
+
CommonUtils.delete(events, eventName);
|
|
620
652
|
});
|
|
621
653
|
});
|
|
622
654
|
});
|
|
@@ -634,16 +666,16 @@ export class DOMUtilsEvent {
|
|
|
634
666
|
if (typeof callback !== "function") {
|
|
635
667
|
return;
|
|
636
668
|
}
|
|
637
|
-
const
|
|
669
|
+
const that = this;
|
|
638
670
|
/**
|
|
639
671
|
* 检测文档是否加载完毕
|
|
640
672
|
*/
|
|
641
673
|
function checkDOMReadyState() {
|
|
642
674
|
try {
|
|
643
675
|
if (
|
|
644
|
-
|
|
645
|
-
(
|
|
646
|
-
!(
|
|
676
|
+
that.windowApi.document.readyState === "complete" ||
|
|
677
|
+
(that.windowApi.document.readyState !== "loading" &&
|
|
678
|
+
!(that.windowApi.document.documentElement as any).doScroll)
|
|
647
679
|
) {
|
|
648
680
|
return true;
|
|
649
681
|
} else {
|
|
@@ -663,12 +695,12 @@ export class DOMUtilsEvent {
|
|
|
663
695
|
|
|
664
696
|
const targetList = [
|
|
665
697
|
{
|
|
666
|
-
target:
|
|
698
|
+
target: that.windowApi.document,
|
|
667
699
|
eventType: "DOMContentLoaded",
|
|
668
700
|
callback: completed,
|
|
669
701
|
},
|
|
670
702
|
{
|
|
671
|
-
target:
|
|
703
|
+
target: that.windowApi.window,
|
|
672
704
|
eventType: "load",
|
|
673
705
|
callback: completed,
|
|
674
706
|
},
|
|
@@ -693,7 +725,7 @@ export class DOMUtilsEvent {
|
|
|
693
725
|
}
|
|
694
726
|
if (checkDOMReadyState()) {
|
|
695
727
|
/* 检查document状态 */
|
|
696
|
-
|
|
728
|
+
CommonUtils.setTimeout(callback, 0);
|
|
697
729
|
} else {
|
|
698
730
|
/* 添加监听 */
|
|
699
731
|
addDomReadyListener();
|
|
@@ -704,7 +736,7 @@ export class DOMUtilsEvent {
|
|
|
704
736
|
* @param element 需要触发的元素|元素数组|window
|
|
705
737
|
* @param eventType 需要触发的事件
|
|
706
738
|
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
707
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent
|
|
739
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
|
|
708
740
|
* @example
|
|
709
741
|
* // 触发元素a.xx的click事件
|
|
710
742
|
* DOMUtils.trigger(document.querySelector("a.xx"),"click")
|
|
@@ -715,7 +747,7 @@ export class DOMUtilsEvent {
|
|
|
715
747
|
*/
|
|
716
748
|
trigger(
|
|
717
749
|
element: DOMUtilsTargetElementType | Element | DocumentFragment | any[] | typeof globalThis | Window | Document,
|
|
718
|
-
eventType: string,
|
|
750
|
+
eventType: string | string[],
|
|
719
751
|
details?: object,
|
|
720
752
|
useDispatchToTriggerEvent?: boolean
|
|
721
753
|
): void;
|
|
@@ -724,7 +756,7 @@ export class DOMUtilsEvent {
|
|
|
724
756
|
* @param element 需要触发的元素|元素数组|window
|
|
725
757
|
* @param eventType 需要触发的事件
|
|
726
758
|
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
727
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
|
|
759
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
|
|
728
760
|
* @example
|
|
729
761
|
* // 触发元素a.xx的click事件
|
|
730
762
|
* DOMUtils.trigger(document.querySelector("a.xx"),"click")
|
|
@@ -734,7 +766,7 @@ export class DOMUtilsEvent {
|
|
|
734
766
|
* DOMUtils.trigger("a.xx",["click","tap","hover"])
|
|
735
767
|
*/
|
|
736
768
|
trigger(
|
|
737
|
-
element:
|
|
769
|
+
element: Element | string | NodeList | any[] | Window | Document,
|
|
738
770
|
eventType: DOMUtils_EventType | DOMUtils_EventType[],
|
|
739
771
|
details?: object,
|
|
740
772
|
useDispatchToTriggerEvent?: boolean
|
|
@@ -744,7 +776,7 @@ export class DOMUtilsEvent {
|
|
|
744
776
|
* @param element 需要触发的元素|元素数组|window
|
|
745
777
|
* @param eventType 需要触发的事件
|
|
746
778
|
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
747
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent
|
|
779
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
|
|
748
780
|
* @example
|
|
749
781
|
* // 触发元素a.xx的click事件
|
|
750
782
|
* DOMUtils.trigger(document.querySelector("a.xx"),"click")
|
|
@@ -754,53 +786,59 @@ export class DOMUtilsEvent {
|
|
|
754
786
|
* DOMUtils.trigger("a.xx",["click","tap","hover"])
|
|
755
787
|
*/
|
|
756
788
|
trigger(
|
|
757
|
-
element:
|
|
758
|
-
eventType: DOMUtils_EventType | DOMUtils_EventType[] | string,
|
|
789
|
+
element: Element | string | NodeList | any[] | Window | Document,
|
|
790
|
+
eventType: DOMUtils_EventType | DOMUtils_EventType[] | string | string[],
|
|
759
791
|
details?: object,
|
|
760
792
|
useDispatchToTriggerEvent: boolean = true
|
|
761
793
|
) {
|
|
762
|
-
const
|
|
794
|
+
const that = this;
|
|
763
795
|
if (typeof element === "string") {
|
|
764
|
-
element =
|
|
796
|
+
element = that.selectorAll(element);
|
|
765
797
|
}
|
|
766
798
|
if (element == null) {
|
|
767
799
|
return;
|
|
768
800
|
}
|
|
769
|
-
let
|
|
801
|
+
let $elList: (Document | Window | Element)[] = [];
|
|
770
802
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
771
|
-
|
|
772
|
-
elementList = [...element];
|
|
803
|
+
$elList = $elList.concat(Array.from(element));
|
|
773
804
|
} else {
|
|
774
|
-
|
|
805
|
+
$elList.push(element);
|
|
775
806
|
}
|
|
776
807
|
let eventTypeList: string[] = [];
|
|
777
808
|
if (Array.isArray(eventType)) {
|
|
778
|
-
eventTypeList = eventType
|
|
809
|
+
eventTypeList = eventType.filter((it) => typeof it === "string" && it.trim() !== "");
|
|
779
810
|
} else if (typeof eventType === "string") {
|
|
780
811
|
eventTypeList = eventType.split(" ");
|
|
781
812
|
}
|
|
782
813
|
|
|
783
|
-
|
|
814
|
+
$elList.forEach(($elItem) => {
|
|
784
815
|
/* 获取对象上的事件 */
|
|
785
|
-
const
|
|
786
|
-
|
|
816
|
+
const elementEvents: {
|
|
817
|
+
[key: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
818
|
+
} = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
|
|
819
|
+
eventTypeList.forEach((eventTypeItem) => {
|
|
787
820
|
let event: Event = null as any;
|
|
788
821
|
if (details && details instanceof Event) {
|
|
789
822
|
event = details;
|
|
790
823
|
} else {
|
|
791
|
-
|
|
824
|
+
// 构造事件
|
|
825
|
+
event = new Event(eventTypeItem);
|
|
792
826
|
if (details) {
|
|
793
|
-
Object.keys(details)
|
|
794
|
-
|
|
827
|
+
const detailKeys = Object.keys(details);
|
|
828
|
+
detailKeys.forEach((keyName) => {
|
|
829
|
+
const value = Reflect.get(details, keyName);
|
|
830
|
+
// 在event上添加属性
|
|
831
|
+
Reflect.set(event, keyName, value);
|
|
795
832
|
});
|
|
796
833
|
}
|
|
797
834
|
}
|
|
798
|
-
if (useDispatchToTriggerEvent == false &&
|
|
799
|
-
|
|
835
|
+
if (useDispatchToTriggerEvent == false && eventTypeItem in elementEvents) {
|
|
836
|
+
// 直接调用监听的事件
|
|
837
|
+
elementEvents[eventTypeItem].forEach((eventsItem: any) => {
|
|
800
838
|
eventsItem.callback(event);
|
|
801
839
|
});
|
|
802
840
|
} else {
|
|
803
|
-
|
|
841
|
+
$elItem.dispatchEvent(event);
|
|
804
842
|
}
|
|
805
843
|
});
|
|
806
844
|
});
|
|
@@ -826,24 +864,24 @@ export class DOMUtilsEvent {
|
|
|
826
864
|
details?: any,
|
|
827
865
|
useDispatchToTriggerEvent?: boolean
|
|
828
866
|
) {
|
|
829
|
-
const
|
|
867
|
+
const that = this;
|
|
830
868
|
if (typeof element === "string") {
|
|
831
|
-
element =
|
|
869
|
+
element = that.selectorAll(element);
|
|
832
870
|
}
|
|
833
871
|
if (element == null) {
|
|
834
872
|
return;
|
|
835
873
|
}
|
|
836
|
-
if (
|
|
874
|
+
if (CommonUtils.isNodeList(element)) {
|
|
837
875
|
// 设置
|
|
838
876
|
element.forEach(($ele) => {
|
|
839
|
-
|
|
877
|
+
that.click($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
|
|
840
878
|
});
|
|
841
879
|
return;
|
|
842
880
|
}
|
|
843
881
|
if (handler == null) {
|
|
844
|
-
|
|
882
|
+
that.trigger(element, "click", details, useDispatchToTriggerEvent);
|
|
845
883
|
} else {
|
|
846
|
-
|
|
884
|
+
that.on(element, "click", null, handler);
|
|
847
885
|
}
|
|
848
886
|
}
|
|
849
887
|
/**
|
|
@@ -866,24 +904,24 @@ export class DOMUtilsEvent {
|
|
|
866
904
|
details?: object,
|
|
867
905
|
useDispatchToTriggerEvent?: boolean
|
|
868
906
|
) {
|
|
869
|
-
const
|
|
907
|
+
const that = this;
|
|
870
908
|
if (typeof element === "string") {
|
|
871
|
-
element =
|
|
909
|
+
element = that.selectorAll(element);
|
|
872
910
|
}
|
|
873
911
|
if (element == null) {
|
|
874
912
|
return;
|
|
875
913
|
}
|
|
876
|
-
if (
|
|
914
|
+
if (CommonUtils.isNodeList(element)) {
|
|
877
915
|
// 设置
|
|
878
916
|
element.forEach(($ele) => {
|
|
879
|
-
|
|
917
|
+
that.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
|
|
880
918
|
});
|
|
881
919
|
return;
|
|
882
920
|
}
|
|
883
921
|
if (handler === null) {
|
|
884
|
-
|
|
922
|
+
that.trigger(element, "blur", details, useDispatchToTriggerEvent);
|
|
885
923
|
} else {
|
|
886
|
-
|
|
924
|
+
that.on(element, "blur", null, handler as (event: Event) => void);
|
|
887
925
|
}
|
|
888
926
|
}
|
|
889
927
|
/**
|
|
@@ -906,24 +944,24 @@ export class DOMUtilsEvent {
|
|
|
906
944
|
details?: object,
|
|
907
945
|
useDispatchToTriggerEvent?: boolean
|
|
908
946
|
) {
|
|
909
|
-
const
|
|
947
|
+
const that = this;
|
|
910
948
|
if (typeof element === "string") {
|
|
911
|
-
element =
|
|
949
|
+
element = that.selectorAll(element);
|
|
912
950
|
}
|
|
913
951
|
if (element == null) {
|
|
914
952
|
return;
|
|
915
953
|
}
|
|
916
|
-
if (
|
|
954
|
+
if (CommonUtils.isNodeList(element)) {
|
|
917
955
|
// 设置
|
|
918
956
|
element.forEach(($ele) => {
|
|
919
|
-
|
|
957
|
+
that.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
|
|
920
958
|
});
|
|
921
959
|
return;
|
|
922
960
|
}
|
|
923
961
|
if (handler == null) {
|
|
924
|
-
|
|
962
|
+
that.trigger(element, "focus", details, useDispatchToTriggerEvent);
|
|
925
963
|
} else {
|
|
926
|
-
|
|
964
|
+
that.on(element, "focus", null, handler);
|
|
927
965
|
}
|
|
928
966
|
}
|
|
929
967
|
/**
|
|
@@ -945,22 +983,22 @@ export class DOMUtilsEvent {
|
|
|
945
983
|
handler: (this: HTMLElement, event: DOMUtils_Event["hover"]) => void,
|
|
946
984
|
option?: boolean | DOMUtilsEventListenerOption
|
|
947
985
|
) {
|
|
948
|
-
const
|
|
986
|
+
const that = this;
|
|
949
987
|
if (typeof element === "string") {
|
|
950
|
-
element =
|
|
988
|
+
element = that.selectorAll(element);
|
|
951
989
|
}
|
|
952
990
|
if (element == null) {
|
|
953
991
|
return;
|
|
954
992
|
}
|
|
955
|
-
if (
|
|
993
|
+
if (CommonUtils.isNodeList(element)) {
|
|
956
994
|
// 设置
|
|
957
995
|
element.forEach(($ele) => {
|
|
958
|
-
|
|
996
|
+
that.hover($ele as HTMLElement, handler, option);
|
|
959
997
|
});
|
|
960
998
|
return;
|
|
961
999
|
}
|
|
962
|
-
|
|
963
|
-
|
|
1000
|
+
that.on(element, "mouseenter", null, handler, option);
|
|
1001
|
+
that.on(element, "mouseleave", null, handler, option);
|
|
964
1002
|
}
|
|
965
1003
|
/**
|
|
966
1004
|
* 当动画结束时触发事件
|
|
@@ -973,30 +1011,23 @@ export class DOMUtilsEvent {
|
|
|
973
1011
|
handler: (this: HTMLElement, event: DOMUtils_Event["animationend"]) => void,
|
|
974
1012
|
option?: boolean | DOMUtilsEventListenerOption
|
|
975
1013
|
) {
|
|
976
|
-
const
|
|
1014
|
+
const that = this;
|
|
977
1015
|
if (typeof element === "string") {
|
|
978
|
-
element =
|
|
1016
|
+
element = that.selector(element)!;
|
|
979
1017
|
}
|
|
980
1018
|
if (element == null) {
|
|
981
1019
|
return;
|
|
982
1020
|
}
|
|
983
|
-
// if (DOMUtilsCommonUtils.isNodeList(element)) {
|
|
984
|
-
// // 设置
|
|
985
|
-
// element.forEach(($ele) => {
|
|
986
|
-
// DOMUtilsContext.animationend($ele as HTMLElement, handler, option);
|
|
987
|
-
// });
|
|
988
|
-
// return;
|
|
989
|
-
// }
|
|
990
1021
|
const defaultOption: DOMUtilsEventListenerOption = {
|
|
991
1022
|
once: true,
|
|
992
1023
|
};
|
|
993
1024
|
Object.assign(defaultOption, option || {});
|
|
994
|
-
const eventNameList =
|
|
995
|
-
|
|
1025
|
+
const eventNameList = CommonUtils.getAnimationEndNameList();
|
|
1026
|
+
that.on(element, eventNameList, null, handler, defaultOption);
|
|
996
1027
|
if (!defaultOption.once) {
|
|
997
1028
|
return {
|
|
998
1029
|
off() {
|
|
999
|
-
|
|
1030
|
+
that.off(element, eventNameList, null, handler, defaultOption);
|
|
1000
1031
|
},
|
|
1001
1032
|
};
|
|
1002
1033
|
}
|
|
@@ -1012,30 +1043,23 @@ export class DOMUtilsEvent {
|
|
|
1012
1043
|
handler: (this: HTMLElement, event: DOMUtils_Event["transitionend"]) => void,
|
|
1013
1044
|
option?: boolean | DOMUtilsEventListenerOption
|
|
1014
1045
|
) {
|
|
1015
|
-
const
|
|
1046
|
+
const that = this;
|
|
1016
1047
|
if (typeof element === "string") {
|
|
1017
|
-
element =
|
|
1048
|
+
element = that.selector(element)!;
|
|
1018
1049
|
}
|
|
1019
1050
|
if (element == null) {
|
|
1020
1051
|
return;
|
|
1021
1052
|
}
|
|
1022
|
-
// if (DOMUtilsCommonUtils.isNodeList(element)) {
|
|
1023
|
-
// // 设置
|
|
1024
|
-
// element.forEach(($ele) => {
|
|
1025
|
-
// DOMUtilsContext.transitionend($ele as HTMLElement, handler, option);
|
|
1026
|
-
// });
|
|
1027
|
-
// return;
|
|
1028
|
-
// }
|
|
1029
1053
|
const defaultOption: DOMUtilsEventListenerOption = {
|
|
1030
1054
|
once: true,
|
|
1031
1055
|
};
|
|
1032
1056
|
Object.assign(defaultOption, option || {});
|
|
1033
|
-
const eventNameList =
|
|
1034
|
-
|
|
1057
|
+
const eventNameList = CommonUtils.getTransitionEndNameList();
|
|
1058
|
+
that.on(element, eventNameList, null, handler, defaultOption);
|
|
1035
1059
|
if (!defaultOption.once) {
|
|
1036
1060
|
return {
|
|
1037
1061
|
off() {
|
|
1038
|
-
|
|
1062
|
+
that.off(element, eventNameList, null, handler, defaultOption);
|
|
1039
1063
|
},
|
|
1040
1064
|
};
|
|
1041
1065
|
}
|
|
@@ -1060,21 +1084,21 @@ export class DOMUtilsEvent {
|
|
|
1060
1084
|
handler: (this: HTMLElement, event: DOMUtils_Event["keyup"]) => void,
|
|
1061
1085
|
option?: boolean | DOMUtilsEventListenerOption
|
|
1062
1086
|
) {
|
|
1063
|
-
const
|
|
1087
|
+
const that = this;
|
|
1064
1088
|
if (element == null) {
|
|
1065
1089
|
return;
|
|
1066
1090
|
}
|
|
1067
1091
|
if (typeof element === "string") {
|
|
1068
|
-
element =
|
|
1092
|
+
element = that.selectorAll(element);
|
|
1069
1093
|
}
|
|
1070
|
-
if (
|
|
1094
|
+
if (CommonUtils.isNodeList(element)) {
|
|
1071
1095
|
// 设置
|
|
1072
1096
|
element.forEach(($ele) => {
|
|
1073
|
-
|
|
1097
|
+
that.keyup($ele as HTMLElement, handler, option);
|
|
1074
1098
|
});
|
|
1075
1099
|
return;
|
|
1076
1100
|
}
|
|
1077
|
-
|
|
1101
|
+
that.on(element, "keyup", null, handler, option);
|
|
1078
1102
|
}
|
|
1079
1103
|
/**
|
|
1080
1104
|
* 当按键按下时触发事件
|
|
@@ -1096,21 +1120,21 @@ export class DOMUtilsEvent {
|
|
|
1096
1120
|
handler: (this: HTMLElement, event: DOMUtils_Event["keydown"]) => void,
|
|
1097
1121
|
option?: boolean | DOMUtilsEventListenerOption
|
|
1098
1122
|
) {
|
|
1099
|
-
const
|
|
1123
|
+
const that = this;
|
|
1100
1124
|
if (element == null) {
|
|
1101
1125
|
return;
|
|
1102
1126
|
}
|
|
1103
1127
|
if (typeof element === "string") {
|
|
1104
|
-
element =
|
|
1128
|
+
element = that.selectorAll(element);
|
|
1105
1129
|
}
|
|
1106
|
-
if (
|
|
1130
|
+
if (CommonUtils.isNodeList(element)) {
|
|
1107
1131
|
// 设置
|
|
1108
1132
|
element.forEach(($ele) => {
|
|
1109
|
-
|
|
1133
|
+
that.keydown($ele as HTMLElement, handler, option);
|
|
1110
1134
|
});
|
|
1111
1135
|
return;
|
|
1112
1136
|
}
|
|
1113
|
-
|
|
1137
|
+
that.on(element, "keydown", null, handler, option);
|
|
1114
1138
|
}
|
|
1115
1139
|
/**
|
|
1116
1140
|
* 当按键按下时触发事件
|
|
@@ -1132,21 +1156,21 @@ export class DOMUtilsEvent {
|
|
|
1132
1156
|
handler: (this: HTMLElement, event: DOMUtils_Event["keypress"]) => void,
|
|
1133
1157
|
option?: boolean | DOMUtilsEventListenerOption
|
|
1134
1158
|
) {
|
|
1135
|
-
const
|
|
1159
|
+
const that = this;
|
|
1136
1160
|
if (element == null) {
|
|
1137
1161
|
return;
|
|
1138
1162
|
}
|
|
1139
1163
|
if (typeof element === "string") {
|
|
1140
|
-
element =
|
|
1164
|
+
element = that.selectorAll(element);
|
|
1141
1165
|
}
|
|
1142
|
-
if (
|
|
1166
|
+
if (CommonUtils.isNodeList(element)) {
|
|
1143
1167
|
// 设置
|
|
1144
1168
|
element.forEach(($ele) => {
|
|
1145
|
-
|
|
1169
|
+
that.keypress($ele as HTMLElement, handler, option);
|
|
1146
1170
|
});
|
|
1147
1171
|
return;
|
|
1148
1172
|
}
|
|
1149
|
-
|
|
1173
|
+
that.on(element, "keypress", null, handler, option);
|
|
1150
1174
|
}
|
|
1151
1175
|
/**
|
|
1152
1176
|
* 监听某个元素键盘按键事件或window全局按键事件
|
|
@@ -1219,9 +1243,9 @@ export class DOMUtilsEvent {
|
|
|
1219
1243
|
): {
|
|
1220
1244
|
removeListen(): void;
|
|
1221
1245
|
} {
|
|
1222
|
-
const
|
|
1246
|
+
const that = this;
|
|
1223
1247
|
if (typeof element === "string") {
|
|
1224
|
-
element =
|
|
1248
|
+
element = that.selectorAll(element);
|
|
1225
1249
|
}
|
|
1226
1250
|
const keyboardEventCallBack = function (event: KeyboardEvent) {
|
|
1227
1251
|
/** 键名 */
|
|
@@ -1246,258 +1270,58 @@ export class DOMUtilsEvent {
|
|
|
1246
1270
|
callback(keyName, keyValue, otherCodeList, event);
|
|
1247
1271
|
}
|
|
1248
1272
|
};
|
|
1249
|
-
|
|
1273
|
+
that.on(element, eventName, keyboardEventCallBack, options);
|
|
1250
1274
|
return {
|
|
1251
1275
|
removeListen: () => {
|
|
1252
|
-
|
|
1276
|
+
that.off(element, eventName, keyboardEventCallBack, options);
|
|
1253
1277
|
},
|
|
1254
1278
|
};
|
|
1255
1279
|
}
|
|
1256
1280
|
/**
|
|
1257
|
-
*
|
|
1258
|
-
*
|
|
1259
|
-
* + :contains([text]) 作用: 找到包含指定文本内容的指定元素
|
|
1260
|
-
* + :empty 作用:找到既没有文本内容也没有子元素的指定元素
|
|
1261
|
-
* + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
|
|
1262
|
-
* @param selector 选择器
|
|
1263
|
-
* @param parent 指定父元素
|
|
1264
|
-
* @example
|
|
1265
|
-
* DOMUtils.selector("div:contains('测试')")
|
|
1266
|
-
* > div.xxx
|
|
1267
|
-
* @example
|
|
1268
|
-
* DOMUtils.selector("div:empty")
|
|
1269
|
-
* > div.xxx
|
|
1270
|
-
* @example
|
|
1271
|
-
* DOMUtils.selector("div:regexp('^xxxx$')")
|
|
1272
|
-
* > div.xxx
|
|
1273
|
-
*/
|
|
1274
|
-
selector<K extends keyof HTMLElementTagNameMap>(
|
|
1275
|
-
selector: K,
|
|
1276
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1277
|
-
): HTMLElementTagNameMap[K] | undefined;
|
|
1278
|
-
selector<E extends Element = HTMLElement>(
|
|
1279
|
-
selector: string,
|
|
1280
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1281
|
-
): E | undefined;
|
|
1282
|
-
selector<E extends Element = HTMLElement>(
|
|
1283
|
-
selector: string,
|
|
1284
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1285
|
-
) {
|
|
1286
|
-
return this.selectorAll<E>(selector, parent)[0];
|
|
1287
|
-
}
|
|
1288
|
-
/**
|
|
1289
|
-
* 选择器,可使用以下的额外语法
|
|
1290
|
-
*
|
|
1291
|
-
* + :contains([text]) 作用: 找到包含指定文本内容的指定元素
|
|
1292
|
-
* + :empty 作用:找到既没有文本内容也没有子元素的指定元素
|
|
1293
|
-
* + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
|
|
1294
|
-
* @param selector 选择器
|
|
1295
|
-
* @param parent 指定父元素
|
|
1296
|
-
* @example
|
|
1297
|
-
* DOMUtils.selectorAll("div:contains('测试')")
|
|
1298
|
-
* > [div.xxx]
|
|
1281
|
+
* 阻止事件传递
|
|
1282
|
+
* @param event 要阻止传递的事件
|
|
1299
1283
|
* @example
|
|
1300
|
-
* DOMUtils.
|
|
1301
|
-
* > [div.xxx]
|
|
1302
|
-
* @example
|
|
1303
|
-
* DOMUtils.selectorAll("div:regexp('^xxxx$')")
|
|
1304
|
-
* > [div.xxx]
|
|
1305
|
-
* @example
|
|
1306
|
-
* DOMUtils.selectorAll("div:regexp(/^xxx/ig)")
|
|
1307
|
-
* > [div.xxx]
|
|
1284
|
+
* DOMUtils.preventEvent(event);
|
|
1308
1285
|
*/
|
|
1309
|
-
|
|
1310
|
-
selector: K,
|
|
1311
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1312
|
-
): HTMLElementTagNameMap[K][];
|
|
1313
|
-
selectorAll<E extends Element = HTMLElement>(
|
|
1314
|
-
selector: string,
|
|
1315
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1316
|
-
): E[];
|
|
1317
|
-
selectorAll<E extends Element = HTMLElement>(
|
|
1318
|
-
selector: string,
|
|
1319
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1320
|
-
) {
|
|
1321
|
-
const context = this;
|
|
1322
|
-
parent = parent || context.windowApi.document;
|
|
1323
|
-
selector = selector.trim();
|
|
1324
|
-
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
1325
|
-
// empty 语法
|
|
1326
|
-
selector = selector.replace(/:empty$/gi, "");
|
|
1327
|
-
return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
|
|
1328
|
-
return $ele?.innerHTML?.trim() === "";
|
|
1329
|
-
});
|
|
1330
|
-
} else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
1331
|
-
// contains 语法
|
|
1332
|
-
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
1333
|
-
const text = textMatch![2];
|
|
1334
|
-
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
1335
|
-
return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
|
|
1336
|
-
// @ts-ignore
|
|
1337
|
-
return ($ele?.textContent || $ele?.innerText)?.includes(text);
|
|
1338
|
-
});
|
|
1339
|
-
} else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
1340
|
-
// regexp 语法
|
|
1341
|
-
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
1342
|
-
let pattern = textMatch![2];
|
|
1343
|
-
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
1344
|
-
let flags = "";
|
|
1345
|
-
if (flagMatch) {
|
|
1346
|
-
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
1347
|
-
flags = flagMatch[3];
|
|
1348
|
-
}
|
|
1349
|
-
const regexp = new RegExp(pattern, flags);
|
|
1350
|
-
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
1351
|
-
return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
|
|
1352
|
-
// @ts-ignore
|
|
1353
|
-
return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
|
|
1354
|
-
});
|
|
1355
|
-
} else {
|
|
1356
|
-
// 普通语法
|
|
1357
|
-
return Array.from(parent.querySelectorAll<E>(selector));
|
|
1358
|
-
}
|
|
1359
|
-
}
|
|
1286
|
+
preventEvent(event: Event): boolean;
|
|
1360
1287
|
/**
|
|
1361
|
-
*
|
|
1362
|
-
*
|
|
1363
|
-
*
|
|
1364
|
-
*
|
|
1365
|
-
* + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
|
|
1366
|
-
* @param $el 元素
|
|
1367
|
-
* @param selector 选择器
|
|
1288
|
+
* 通过监听事件来主动阻止事件的传递
|
|
1289
|
+
* @param $el 要进行处理的元素
|
|
1290
|
+
* @param eventNameList (可选)要阻止的事件名|列表
|
|
1291
|
+
* @param capture (可选)是否捕获,默认false
|
|
1368
1292
|
* @example
|
|
1369
|
-
* DOMUtils.
|
|
1370
|
-
* > true
|
|
1371
|
-
* @example
|
|
1372
|
-
* DOMUtils.matches("div:empty")
|
|
1373
|
-
* > true
|
|
1374
|
-
* @example
|
|
1375
|
-
* DOMUtils.matches("div:regexp('^xxxx$')")
|
|
1376
|
-
* > true
|
|
1377
|
-
* @example
|
|
1378
|
-
* DOMUtils.matches("div:regexp(/^xxx/ig)")
|
|
1379
|
-
* > false
|
|
1293
|
+
* DOMUtils.preventEvent(document.querySelector("a"),"click")
|
|
1380
1294
|
*/
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1295
|
+
preventEvent($el: HTMLElement, eventNameList?: string | string[], capture?: boolean): void;
|
|
1296
|
+
preventEvent(...args: any[]) {
|
|
1297
|
+
/**
|
|
1298
|
+
* 阻止事件的默认行为发生,并阻止事件传播
|
|
1299
|
+
*/
|
|
1300
|
+
const stopEvent = (event: Event) => {
|
|
1301
|
+
/* 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL */
|
|
1302
|
+
event?.preventDefault();
|
|
1303
|
+
/* 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素 */
|
|
1304
|
+
event?.stopPropagation();
|
|
1305
|
+
/* 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发 */
|
|
1306
|
+
event?.stopImmediatePropagation();
|
|
1384
1307
|
return false;
|
|
1385
|
-
}
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
selector = selector.replace(/:empty$/gi, "");
|
|
1390
|
-
return $el.matches(selector) && $el?.innerHTML?.trim() === "";
|
|
1391
|
-
} else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
1392
|
-
// contains 语法
|
|
1393
|
-
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
1394
|
-
const text = textMatch![2];
|
|
1395
|
-
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
1396
|
-
// @ts-ignore
|
|
1397
|
-
let content = $el?.textContent || $el?.innerText;
|
|
1398
|
-
if (typeof content !== "string") {
|
|
1399
|
-
content = "";
|
|
1400
|
-
}
|
|
1401
|
-
return $el.matches(selector) && content?.includes(text);
|
|
1402
|
-
} else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
1403
|
-
// regexp 语法
|
|
1404
|
-
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
1405
|
-
let pattern = textMatch![2];
|
|
1406
|
-
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
1407
|
-
let flags = "";
|
|
1408
|
-
if (flagMatch) {
|
|
1409
|
-
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
1410
|
-
flags = flagMatch[3];
|
|
1411
|
-
}
|
|
1412
|
-
const regexp = new RegExp(pattern, flags);
|
|
1413
|
-
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
1414
|
-
// @ts-ignore
|
|
1415
|
-
let content = $el?.textContent || $el?.innerText;
|
|
1416
|
-
if (typeof content !== "string") {
|
|
1417
|
-
content = "";
|
|
1418
|
-
}
|
|
1419
|
-
return $el.matches(selector) && Boolean(content?.match(regexp));
|
|
1308
|
+
};
|
|
1309
|
+
if (args.length === 1) {
|
|
1310
|
+
/* 直接阻止事件 */
|
|
1311
|
+
return stopEvent(args[0]);
|
|
1420
1312
|
} else {
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
*
|
|
1428
|
-
* + :contains([text]) 作用: 找到包含指定文本内容的指定元素
|
|
1429
|
-
* + :empty 作用:找到既没有文本内容也没有子元素的指定元素
|
|
1430
|
-
* + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
|
|
1431
|
-
* @param $el 元素
|
|
1432
|
-
* @param selector 选择器
|
|
1433
|
-
* @example
|
|
1434
|
-
* DOMUtils.closest("div:contains('测试')")
|
|
1435
|
-
* > div.xxx
|
|
1436
|
-
* @example
|
|
1437
|
-
* DOMUtils.closest("div:empty")
|
|
1438
|
-
* > div.xxx
|
|
1439
|
-
* @example
|
|
1440
|
-
* DOMUtils.closest("div:regexp('^xxxx$')")
|
|
1441
|
-
* > div.xxxx
|
|
1442
|
-
* @example
|
|
1443
|
-
* DOMUtils.closest("div:regexp(/^xxx/ig)")
|
|
1444
|
-
* > null
|
|
1445
|
-
*/
|
|
1446
|
-
closest<K extends keyof HTMLElementTagNameMap>(
|
|
1447
|
-
$el: HTMLElement | Element,
|
|
1448
|
-
selector: string
|
|
1449
|
-
): HTMLElementTagNameMap[K] | null;
|
|
1450
|
-
closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null;
|
|
1451
|
-
closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null {
|
|
1452
|
-
selector = selector.trim();
|
|
1453
|
-
|
|
1454
|
-
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
1455
|
-
// empty 语法
|
|
1456
|
-
selector = selector.replace(/:empty$/gi, "");
|
|
1457
|
-
const $closest = $el?.closest<E>(selector);
|
|
1458
|
-
if ($closest && $closest?.innerHTML?.trim() === "") {
|
|
1459
|
-
return $closest;
|
|
1460
|
-
}
|
|
1461
|
-
return null;
|
|
1462
|
-
} else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
1463
|
-
// contains 语法
|
|
1464
|
-
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
1465
|
-
const text = textMatch![2];
|
|
1466
|
-
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
1467
|
-
const $closest = $el?.closest<E>(selector);
|
|
1468
|
-
if ($closest) {
|
|
1469
|
-
// @ts-ignore
|
|
1470
|
-
const content = $el?.textContent || $el?.innerText;
|
|
1471
|
-
if (typeof content === "string" && content.includes(text)) {
|
|
1472
|
-
return $closest;
|
|
1473
|
-
}
|
|
1313
|
+
const $el: HTMLElement = args[0];
|
|
1314
|
+
let eventNameList: string | string[] = args[1];
|
|
1315
|
+
const capture: boolean = args[2];
|
|
1316
|
+
/* 添加对应的事件来阻止触发 */
|
|
1317
|
+
if (typeof eventNameList === "string") {
|
|
1318
|
+
eventNameList = [eventNameList];
|
|
1474
1319
|
}
|
|
1475
|
-
|
|
1476
|
-
} else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
1477
|
-
// regexp 语法
|
|
1478
|
-
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
1479
|
-
let pattern = textMatch![2];
|
|
1480
|
-
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
1481
|
-
let flags = "";
|
|
1482
|
-
if (flagMatch) {
|
|
1483
|
-
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
1484
|
-
flags = flagMatch[3];
|
|
1485
|
-
}
|
|
1486
|
-
const regexp = new RegExp(pattern, flags);
|
|
1487
|
-
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
1488
|
-
const $closest = $el?.closest<E>(selector);
|
|
1489
|
-
if ($closest) {
|
|
1490
|
-
// @ts-ignore
|
|
1491
|
-
const content = $el?.textContent || $el?.innerText;
|
|
1492
|
-
if (typeof content === "string" && content.match(regexp)) {
|
|
1493
|
-
return $closest;
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
return null;
|
|
1497
|
-
} else {
|
|
1498
|
-
// 普通语法
|
|
1499
|
-
const $closest = $el?.closest<E>(selector);
|
|
1500
|
-
return $closest;
|
|
1320
|
+
this.on($el, eventNameList, stopEvent, { capture: Boolean(capture) });
|
|
1501
1321
|
}
|
|
1502
1322
|
}
|
|
1503
1323
|
}
|
|
1324
|
+
|
|
1325
|
+
const elementEvent = new ElementEvent();
|
|
1326
|
+
|
|
1327
|
+
export { elementEvent, ElementEvent };
|