@whitesev/domutils 1.6.7 → 1.7.0
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 +1955 -1067
- 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 +1955 -1067
- 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 +1955 -1067
- 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 +1955 -1067
- 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 +1955 -1067
- 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 +1955 -1067
- 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} +21 -9
- package/dist/types/src/ElementAnimate.d.ts +89 -0
- package/dist/types/src/{DOMUtilsEvent.d.ts → ElementEvent.d.ts} +19 -84
- 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/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 +6 -2
- package/src/{DOMUtilsCommonUtils.ts → CommonUtils.ts} +27 -13
- package/src/ElementAnimate.ts +290 -0
- package/src/{DOMUtilsEvent.ts → ElementEvent.ts} +188 -370
- 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} +679 -758
- 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,6 +1,7 @@
|
|
|
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,
|
|
@@ -12,11 +13,20 @@ import type { DOMUtilsTargetElementType } from "./types/global";
|
|
|
12
13
|
import type { WindowApiOption } from "./types/WindowApi";
|
|
13
14
|
import { WindowApi } from "./WindowApi";
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
class ElementEvent extends ElementAnimate {
|
|
16
17
|
windowApi: typeof WindowApi.prototype;
|
|
17
18
|
constructor(windowApiOption?: WindowApiOption) {
|
|
19
|
+
super(windowApiOption);
|
|
18
20
|
this.windowApi = new WindowApi(windowApiOption);
|
|
19
21
|
}
|
|
22
|
+
/** 获取 animationend 在各个浏览器的兼容名 */
|
|
23
|
+
getAnimationEndNameList() {
|
|
24
|
+
return CommonUtils.getAnimationEndNameList();
|
|
25
|
+
}
|
|
26
|
+
/** 获取 transitionend 在各个浏览器的兼容名 */
|
|
27
|
+
getTransitionEndNameList() {
|
|
28
|
+
return CommonUtils.getTransitionEndNameList();
|
|
29
|
+
}
|
|
20
30
|
/**
|
|
21
31
|
* 绑定事件
|
|
22
32
|
* @param element 需要绑定的元素|元素数组|window
|
|
@@ -173,11 +183,11 @@ export class DOMUtilsEvent {
|
|
|
173
183
|
return option;
|
|
174
184
|
}
|
|
175
185
|
|
|
176
|
-
const
|
|
186
|
+
const that = this;
|
|
177
187
|
// eslint-disable-next-line prefer-rest-params
|
|
178
188
|
const args = arguments;
|
|
179
189
|
if (typeof element === "string") {
|
|
180
|
-
element =
|
|
190
|
+
element = that.selectorAll(element);
|
|
181
191
|
}
|
|
182
192
|
if (element == null) {
|
|
183
193
|
return;
|
|
@@ -230,7 +240,7 @@ export class DOMUtilsEvent {
|
|
|
230
240
|
*/
|
|
231
241
|
function checkOptionOnceToRemoveEventListener() {
|
|
232
242
|
if (listenerOption.once) {
|
|
233
|
-
|
|
243
|
+
that.off(element, eventType as any, selector as any, callback as any, option);
|
|
234
244
|
}
|
|
235
245
|
}
|
|
236
246
|
elementList.forEach((elementItem) => {
|
|
@@ -246,19 +256,19 @@ export class DOMUtilsEvent {
|
|
|
246
256
|
? (event.composedPath()[0] as HTMLElement)
|
|
247
257
|
: (event.target as HTMLElement);
|
|
248
258
|
let totalParent = elementItem;
|
|
249
|
-
if (
|
|
250
|
-
if (totalParent === (
|
|
251
|
-
totalParent =
|
|
259
|
+
if (CommonUtils.isWin(totalParent)) {
|
|
260
|
+
if (totalParent === (that.windowApi.document as any as HTMLElement)) {
|
|
261
|
+
totalParent = that.windowApi.document.documentElement;
|
|
252
262
|
}
|
|
253
263
|
}
|
|
254
264
|
const findValue = selectorList.find((selectorItem) => {
|
|
255
265
|
// 判断目标元素是否匹配选择器
|
|
256
|
-
if (
|
|
266
|
+
if (that.matches(eventTarget, selectorItem)) {
|
|
257
267
|
/* 当前目标可以被selector所匹配到 */
|
|
258
268
|
return true;
|
|
259
269
|
}
|
|
260
270
|
/* 在上层与主元素之间寻找可以被selector所匹配到的 */
|
|
261
|
-
const $closestMatches =
|
|
271
|
+
const $closestMatches = that.closest<HTMLElement>(eventTarget, selectorItem);
|
|
262
272
|
if ($closestMatches && totalParent?.contains($closestMatches)) {
|
|
263
273
|
eventTarget = $closestMatches;
|
|
264
274
|
return true;
|
|
@@ -292,7 +302,7 @@ export class DOMUtilsEvent {
|
|
|
292
302
|
/* 获取对象上的事件 */
|
|
293
303
|
const elementEvents: {
|
|
294
304
|
[k: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
295
|
-
} = Reflect.get(elementItem,
|
|
305
|
+
} = Reflect.get(elementItem, GlobalData.domEventSymbol) || {};
|
|
296
306
|
/* 初始化对象上的xx事件 */
|
|
297
307
|
elementEvents[eventName] = elementEvents[eventName] || [];
|
|
298
308
|
elementEvents[eventName].push({
|
|
@@ -302,7 +312,7 @@ export class DOMUtilsEvent {
|
|
|
302
312
|
originCallBack: listenerCallBack,
|
|
303
313
|
});
|
|
304
314
|
/* 覆盖事件 */
|
|
305
|
-
Reflect.set(elementItem,
|
|
315
|
+
Reflect.set(elementItem, GlobalData.domEventSymbol, elementEvents);
|
|
306
316
|
});
|
|
307
317
|
});
|
|
308
318
|
}
|
|
@@ -440,26 +450,26 @@ export class DOMUtilsEvent {
|
|
|
440
450
|
const currentParam: EventListenerOptions | boolean = args1[startIndex];
|
|
441
451
|
if (typeof currentParam === "boolean") {
|
|
442
452
|
option.capture = currentParam;
|
|
443
|
-
} else if (typeof currentParam === "object" && "capture" in currentParam) {
|
|
453
|
+
} else if (typeof currentParam === "object" && currentParam != null && "capture" in currentParam) {
|
|
444
454
|
option.capture = currentParam.capture;
|
|
445
455
|
}
|
|
446
456
|
return option;
|
|
447
457
|
}
|
|
448
|
-
const
|
|
458
|
+
const that = this;
|
|
449
459
|
// eslint-disable-next-line prefer-rest-params
|
|
450
460
|
const args = arguments;
|
|
451
461
|
if (typeof element === "string") {
|
|
452
|
-
element =
|
|
462
|
+
element = that.selectorAll(element);
|
|
453
463
|
}
|
|
454
464
|
if (element == null) {
|
|
455
465
|
return;
|
|
456
466
|
}
|
|
457
|
-
let
|
|
467
|
+
let $elList: HTMLElement[] = [];
|
|
458
468
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
459
469
|
element = element as HTMLElement[];
|
|
460
|
-
|
|
470
|
+
$elList = [...element];
|
|
461
471
|
} else {
|
|
462
|
-
|
|
472
|
+
$elList.push(element as HTMLElement);
|
|
463
473
|
}
|
|
464
474
|
let eventTypeList: string[] = [];
|
|
465
475
|
if (Array.isArray(eventType)) {
|
|
@@ -507,18 +517,24 @@ export class DOMUtilsEvent {
|
|
|
507
517
|
// 目标函数、事件名、子元素选择器
|
|
508
518
|
isRemoveAll = true;
|
|
509
519
|
}
|
|
510
|
-
|
|
520
|
+
if (args.length === 5 && typeof args[4] === "function" && typeof filter !== "function") {
|
|
521
|
+
// 目标函数、事件名、回调函数、事件配置、过滤函数
|
|
522
|
+
filter = option as (
|
|
523
|
+
value: DOMUtilsEventListenerOptionsAttribute,
|
|
524
|
+
index: number,
|
|
525
|
+
array: DOMUtilsEventListenerOptionsAttribute[]
|
|
526
|
+
) => boolean;
|
|
527
|
+
}
|
|
528
|
+
$elList.forEach(($elItem) => {
|
|
511
529
|
/* 获取对象上的事件 */
|
|
512
530
|
const elementEvents: {
|
|
513
531
|
[key: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
514
|
-
} = Reflect.get(
|
|
532
|
+
} = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
|
|
515
533
|
eventTypeList.forEach((eventName) => {
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
for (let index = 0; index < handlers.length; index++) {
|
|
521
|
-
const handler = handlers[index];
|
|
534
|
+
const handlers = elementEvents[eventName] || [];
|
|
535
|
+
const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
|
|
536
|
+
for (let index = 0; index < filterHandler.length; index++) {
|
|
537
|
+
const handler = filterHandler[index];
|
|
522
538
|
let flag = true;
|
|
523
539
|
if (flag && listenerCallBack && handler.originCallBack !== listenerCallBack) {
|
|
524
540
|
// callback不同
|
|
@@ -530,21 +546,28 @@ export class DOMUtilsEvent {
|
|
|
530
546
|
flag = false;
|
|
531
547
|
}
|
|
532
548
|
}
|
|
533
|
-
if (
|
|
549
|
+
if (
|
|
550
|
+
flag &&
|
|
551
|
+
typeof handler.option.capture === "boolean" &&
|
|
552
|
+
listenerOption.capture !== handler.option.capture
|
|
553
|
+
) {
|
|
534
554
|
// 事件的配置项不同
|
|
535
555
|
flag = false;
|
|
536
556
|
}
|
|
537
557
|
if (flag || isRemoveAll) {
|
|
538
|
-
|
|
539
|
-
handlers.
|
|
558
|
+
$elItem.removeEventListener(eventName, handler.callback, handler.option);
|
|
559
|
+
const findIndex = handlers.findIndex((item) => item === handler);
|
|
560
|
+
if (findIndex !== -1) {
|
|
561
|
+
handlers.splice(findIndex, 1);
|
|
562
|
+
}
|
|
540
563
|
}
|
|
541
564
|
}
|
|
542
565
|
if (handlers.length === 0) {
|
|
543
566
|
/* 如果没有任意的handler,那么删除该属性 */
|
|
544
|
-
|
|
567
|
+
CommonUtils.delete(elementEvents, eventType);
|
|
545
568
|
}
|
|
546
569
|
});
|
|
547
|
-
Reflect.set(
|
|
570
|
+
Reflect.set($elItem, GlobalData.domEventSymbol, elementEvents);
|
|
548
571
|
});
|
|
549
572
|
}
|
|
550
573
|
/**
|
|
@@ -565,18 +588,18 @@ export class DOMUtilsEvent {
|
|
|
565
588
|
* @param eventType (可选)需要取消监听的事件
|
|
566
589
|
*/
|
|
567
590
|
offAll(element: DOMUtilsElementEventType, eventType?: DOMUtils_EventType | DOMUtils_EventType[] | string) {
|
|
568
|
-
const
|
|
591
|
+
const that = this;
|
|
569
592
|
if (typeof element === "string") {
|
|
570
|
-
element =
|
|
593
|
+
element = that.selectorAll(element);
|
|
571
594
|
}
|
|
572
595
|
if (element == null) {
|
|
573
596
|
return;
|
|
574
597
|
}
|
|
575
|
-
let
|
|
598
|
+
let $elList: HTMLElement[] = [];
|
|
576
599
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
577
|
-
|
|
600
|
+
$elList = [...(element as HTMLElement[])];
|
|
578
601
|
} else {
|
|
579
|
-
|
|
602
|
+
$elList.push(element as HTMLElement);
|
|
580
603
|
}
|
|
581
604
|
|
|
582
605
|
let eventTypeList: string[] = [];
|
|
@@ -585,12 +608,15 @@ export class DOMUtilsEvent {
|
|
|
585
608
|
} else if (typeof eventType === "string") {
|
|
586
609
|
eventTypeList = eventTypeList.concat(eventType.split(" "));
|
|
587
610
|
}
|
|
588
|
-
|
|
589
|
-
Object.getOwnPropertySymbols(
|
|
590
|
-
|
|
611
|
+
$elList.forEach(($elItem) => {
|
|
612
|
+
const symbolList = [...new Set([...Object.getOwnPropertySymbols($elItem), GlobalData.domEventSymbol])];
|
|
613
|
+
symbolList.forEach((symbolItem) => {
|
|
614
|
+
if (!symbolItem.toString().startsWith("Symbol(events_")) {
|
|
591
615
|
return;
|
|
592
616
|
}
|
|
593
|
-
const elementEvents
|
|
617
|
+
const elementEvents: {
|
|
618
|
+
[key: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
619
|
+
} = Reflect.get($elItem, symbolItem) || {};
|
|
594
620
|
const iterEventNameList = eventTypeList.length ? eventTypeList : Object.keys(elementEvents);
|
|
595
621
|
iterEventNameList.forEach((eventName) => {
|
|
596
622
|
const handlers: DOMUtilsEventListenerOptionsAttribute[] = elementEvents[eventName];
|
|
@@ -598,12 +624,12 @@ export class DOMUtilsEvent {
|
|
|
598
624
|
return;
|
|
599
625
|
}
|
|
600
626
|
for (const handler of handlers) {
|
|
601
|
-
|
|
627
|
+
$elItem.removeEventListener(eventName, handler.callback, {
|
|
602
628
|
capture: handler["option"]["capture"],
|
|
603
629
|
});
|
|
604
630
|
}
|
|
605
|
-
const events = Reflect.get(
|
|
606
|
-
|
|
631
|
+
const events = Reflect.get($elItem, symbolItem);
|
|
632
|
+
CommonUtils.delete(events, eventName);
|
|
607
633
|
});
|
|
608
634
|
});
|
|
609
635
|
});
|
|
@@ -621,16 +647,16 @@ export class DOMUtilsEvent {
|
|
|
621
647
|
if (typeof callback !== "function") {
|
|
622
648
|
return;
|
|
623
649
|
}
|
|
624
|
-
const
|
|
650
|
+
const that = this;
|
|
625
651
|
/**
|
|
626
652
|
* 检测文档是否加载完毕
|
|
627
653
|
*/
|
|
628
654
|
function checkDOMReadyState() {
|
|
629
655
|
try {
|
|
630
656
|
if (
|
|
631
|
-
|
|
632
|
-
(
|
|
633
|
-
!(
|
|
657
|
+
that.windowApi.document.readyState === "complete" ||
|
|
658
|
+
(that.windowApi.document.readyState !== "loading" &&
|
|
659
|
+
!(that.windowApi.document.documentElement as any).doScroll)
|
|
634
660
|
) {
|
|
635
661
|
return true;
|
|
636
662
|
} else {
|
|
@@ -650,12 +676,12 @@ export class DOMUtilsEvent {
|
|
|
650
676
|
|
|
651
677
|
const targetList = [
|
|
652
678
|
{
|
|
653
|
-
target:
|
|
679
|
+
target: that.windowApi.document,
|
|
654
680
|
eventType: "DOMContentLoaded",
|
|
655
681
|
callback: completed,
|
|
656
682
|
},
|
|
657
683
|
{
|
|
658
|
-
target:
|
|
684
|
+
target: that.windowApi.window,
|
|
659
685
|
eventType: "load",
|
|
660
686
|
callback: completed,
|
|
661
687
|
},
|
|
@@ -680,7 +706,7 @@ export class DOMUtilsEvent {
|
|
|
680
706
|
}
|
|
681
707
|
if (checkDOMReadyState()) {
|
|
682
708
|
/* 检查document状态 */
|
|
683
|
-
|
|
709
|
+
CommonUtils.setTimeout(callback);
|
|
684
710
|
} else {
|
|
685
711
|
/* 添加监听 */
|
|
686
712
|
addDomReadyListener();
|
|
@@ -711,7 +737,7 @@ export class DOMUtilsEvent {
|
|
|
711
737
|
* @param element 需要触发的元素|元素数组|window
|
|
712
738
|
* @param eventType 需要触发的事件
|
|
713
739
|
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
714
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
|
|
740
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,false的话就直接触发获取使用DOMUtils进行监听的事件
|
|
715
741
|
* @example
|
|
716
742
|
* // 触发元素a.xx的click事件
|
|
717
743
|
* DOMUtils.trigger(document.querySelector("a.xx"),"click")
|
|
@@ -731,7 +757,7 @@ export class DOMUtilsEvent {
|
|
|
731
757
|
* @param element 需要触发的元素|元素数组|window
|
|
732
758
|
* @param eventType 需要触发的事件
|
|
733
759
|
* @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
734
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent
|
|
760
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true
|
|
735
761
|
* @example
|
|
736
762
|
* // 触发元素a.xx的click事件
|
|
737
763
|
* DOMUtils.trigger(document.querySelector("a.xx"),"click")
|
|
@@ -746,19 +772,19 @@ export class DOMUtilsEvent {
|
|
|
746
772
|
details?: object,
|
|
747
773
|
useDispatchToTriggerEvent: boolean = true
|
|
748
774
|
) {
|
|
749
|
-
const
|
|
775
|
+
const that = this;
|
|
750
776
|
if (typeof element === "string") {
|
|
751
|
-
element =
|
|
777
|
+
element = that.selectorAll(element);
|
|
752
778
|
}
|
|
753
779
|
if (element == null) {
|
|
754
780
|
return;
|
|
755
781
|
}
|
|
756
|
-
let
|
|
782
|
+
let $elList = [];
|
|
757
783
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
758
784
|
element = element as HTMLElement[];
|
|
759
|
-
|
|
785
|
+
$elList = [...element];
|
|
760
786
|
} else {
|
|
761
|
-
|
|
787
|
+
$elList = [element];
|
|
762
788
|
}
|
|
763
789
|
let eventTypeList: string[] = [];
|
|
764
790
|
if (Array.isArray(eventType)) {
|
|
@@ -767,27 +793,33 @@ export class DOMUtilsEvent {
|
|
|
767
793
|
eventTypeList = eventType.split(" ");
|
|
768
794
|
}
|
|
769
795
|
|
|
770
|
-
|
|
796
|
+
$elList.forEach(($elItem) => {
|
|
771
797
|
/* 获取对象上的事件 */
|
|
772
|
-
const
|
|
773
|
-
|
|
798
|
+
const elementEvents: {
|
|
799
|
+
[key: string]: DOMUtilsEventListenerOptionsAttribute[];
|
|
800
|
+
} = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
|
|
801
|
+
eventTypeList.forEach((__eventType) => {
|
|
774
802
|
let event: Event = null as any;
|
|
775
803
|
if (details && details instanceof Event) {
|
|
776
804
|
event = details;
|
|
777
805
|
} else {
|
|
778
|
-
|
|
806
|
+
// 构造事件
|
|
807
|
+
event = new Event(__eventType);
|
|
779
808
|
if (details) {
|
|
780
809
|
Object.keys(details).forEach((keyName) => {
|
|
781
|
-
|
|
810
|
+
const value = Reflect.get(details, keyName);
|
|
811
|
+
// 在event上添加属性
|
|
812
|
+
Reflect.set(event, keyName, value);
|
|
782
813
|
});
|
|
783
814
|
}
|
|
784
815
|
}
|
|
785
|
-
if (useDispatchToTriggerEvent == false &&
|
|
786
|
-
|
|
816
|
+
if (useDispatchToTriggerEvent == false && __eventType in elementEvents) {
|
|
817
|
+
// 直接调用监听的事件
|
|
818
|
+
elementEvents[__eventType].forEach((eventsItem: any) => {
|
|
787
819
|
eventsItem.callback(event);
|
|
788
820
|
});
|
|
789
821
|
} else {
|
|
790
|
-
|
|
822
|
+
$elItem.dispatchEvent(event);
|
|
791
823
|
}
|
|
792
824
|
});
|
|
793
825
|
});
|
|
@@ -813,24 +845,24 @@ export class DOMUtilsEvent {
|
|
|
813
845
|
details?: any,
|
|
814
846
|
useDispatchToTriggerEvent?: boolean
|
|
815
847
|
) {
|
|
816
|
-
const
|
|
848
|
+
const that = this;
|
|
817
849
|
if (typeof element === "string") {
|
|
818
|
-
element =
|
|
850
|
+
element = that.selectorAll(element);
|
|
819
851
|
}
|
|
820
852
|
if (element == null) {
|
|
821
853
|
return;
|
|
822
854
|
}
|
|
823
|
-
if (
|
|
855
|
+
if (CommonUtils.isNodeList(element)) {
|
|
824
856
|
// 设置
|
|
825
857
|
element.forEach(($ele) => {
|
|
826
|
-
|
|
858
|
+
that.click($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
|
|
827
859
|
});
|
|
828
860
|
return;
|
|
829
861
|
}
|
|
830
862
|
if (handler == null) {
|
|
831
|
-
|
|
863
|
+
that.trigger(element, "click", details, useDispatchToTriggerEvent);
|
|
832
864
|
} else {
|
|
833
|
-
|
|
865
|
+
that.on(element, "click", null, handler);
|
|
834
866
|
}
|
|
835
867
|
}
|
|
836
868
|
/**
|
|
@@ -853,24 +885,24 @@ export class DOMUtilsEvent {
|
|
|
853
885
|
details?: object,
|
|
854
886
|
useDispatchToTriggerEvent?: boolean
|
|
855
887
|
) {
|
|
856
|
-
const
|
|
888
|
+
const that = this;
|
|
857
889
|
if (typeof element === "string") {
|
|
858
|
-
element =
|
|
890
|
+
element = that.selectorAll(element);
|
|
859
891
|
}
|
|
860
892
|
if (element == null) {
|
|
861
893
|
return;
|
|
862
894
|
}
|
|
863
|
-
if (
|
|
895
|
+
if (CommonUtils.isNodeList(element)) {
|
|
864
896
|
// 设置
|
|
865
897
|
element.forEach(($ele) => {
|
|
866
|
-
|
|
898
|
+
that.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
|
|
867
899
|
});
|
|
868
900
|
return;
|
|
869
901
|
}
|
|
870
902
|
if (handler === null) {
|
|
871
|
-
|
|
903
|
+
that.trigger(element, "blur", details, useDispatchToTriggerEvent);
|
|
872
904
|
} else {
|
|
873
|
-
|
|
905
|
+
that.on(element, "blur", null, handler as (event: Event) => void);
|
|
874
906
|
}
|
|
875
907
|
}
|
|
876
908
|
/**
|
|
@@ -893,24 +925,24 @@ export class DOMUtilsEvent {
|
|
|
893
925
|
details?: object,
|
|
894
926
|
useDispatchToTriggerEvent?: boolean
|
|
895
927
|
) {
|
|
896
|
-
const
|
|
928
|
+
const that = this;
|
|
897
929
|
if (typeof element === "string") {
|
|
898
|
-
element =
|
|
930
|
+
element = that.selectorAll(element);
|
|
899
931
|
}
|
|
900
932
|
if (element == null) {
|
|
901
933
|
return;
|
|
902
934
|
}
|
|
903
|
-
if (
|
|
935
|
+
if (CommonUtils.isNodeList(element)) {
|
|
904
936
|
// 设置
|
|
905
937
|
element.forEach(($ele) => {
|
|
906
|
-
|
|
938
|
+
that.focus($ele as HTMLElement, handler, details, useDispatchToTriggerEvent);
|
|
907
939
|
});
|
|
908
940
|
return;
|
|
909
941
|
}
|
|
910
942
|
if (handler == null) {
|
|
911
|
-
|
|
943
|
+
that.trigger(element, "focus", details, useDispatchToTriggerEvent);
|
|
912
944
|
} else {
|
|
913
|
-
|
|
945
|
+
that.on(element, "focus", null, handler);
|
|
914
946
|
}
|
|
915
947
|
}
|
|
916
948
|
/**
|
|
@@ -932,22 +964,22 @@ export class DOMUtilsEvent {
|
|
|
932
964
|
handler: (this: HTMLElement, event: DOMUtils_Event["hover"]) => void,
|
|
933
965
|
option?: boolean | DOMUtilsEventListenerOption
|
|
934
966
|
) {
|
|
935
|
-
const
|
|
967
|
+
const that = this;
|
|
936
968
|
if (typeof element === "string") {
|
|
937
|
-
element =
|
|
969
|
+
element = that.selectorAll(element);
|
|
938
970
|
}
|
|
939
971
|
if (element == null) {
|
|
940
972
|
return;
|
|
941
973
|
}
|
|
942
|
-
if (
|
|
974
|
+
if (CommonUtils.isNodeList(element)) {
|
|
943
975
|
// 设置
|
|
944
976
|
element.forEach(($ele) => {
|
|
945
|
-
|
|
977
|
+
that.hover($ele as HTMLElement, handler, option);
|
|
946
978
|
});
|
|
947
979
|
return;
|
|
948
980
|
}
|
|
949
|
-
|
|
950
|
-
|
|
981
|
+
that.on(element, "mouseenter", null, handler, option);
|
|
982
|
+
that.on(element, "mouseleave", null, handler, option);
|
|
951
983
|
}
|
|
952
984
|
/**
|
|
953
985
|
* 当动画结束时触发事件
|
|
@@ -960,30 +992,23 @@ export class DOMUtilsEvent {
|
|
|
960
992
|
handler: (this: HTMLElement, event: DOMUtils_Event["animationend"]) => void,
|
|
961
993
|
option?: boolean | DOMUtilsEventListenerOption
|
|
962
994
|
) {
|
|
963
|
-
const
|
|
995
|
+
const that = this;
|
|
964
996
|
if (typeof element === "string") {
|
|
965
|
-
element =
|
|
997
|
+
element = that.selector(element)!;
|
|
966
998
|
}
|
|
967
999
|
if (element == null) {
|
|
968
1000
|
return;
|
|
969
1001
|
}
|
|
970
|
-
// if (DOMUtilsCommonUtils.isNodeList(element)) {
|
|
971
|
-
// // 设置
|
|
972
|
-
// element.forEach(($ele) => {
|
|
973
|
-
// DOMUtilsContext.animationend($ele as HTMLElement, handler, option);
|
|
974
|
-
// });
|
|
975
|
-
// return;
|
|
976
|
-
// }
|
|
977
1002
|
const defaultOption: DOMUtilsEventListenerOption = {
|
|
978
1003
|
once: true,
|
|
979
1004
|
};
|
|
980
1005
|
Object.assign(defaultOption, option || {});
|
|
981
|
-
const eventNameList =
|
|
982
|
-
|
|
1006
|
+
const eventNameList = CommonUtils.getAnimationEndNameList();
|
|
1007
|
+
that.on(element, eventNameList, null, handler, defaultOption);
|
|
983
1008
|
if (!defaultOption.once) {
|
|
984
1009
|
return {
|
|
985
1010
|
off() {
|
|
986
|
-
|
|
1011
|
+
that.off(element, eventNameList, null, handler, defaultOption);
|
|
987
1012
|
},
|
|
988
1013
|
};
|
|
989
1014
|
}
|
|
@@ -999,30 +1024,23 @@ export class DOMUtilsEvent {
|
|
|
999
1024
|
handler: (this: HTMLElement, event: DOMUtils_Event["transitionend"]) => void,
|
|
1000
1025
|
option?: boolean | DOMUtilsEventListenerOption
|
|
1001
1026
|
) {
|
|
1002
|
-
const
|
|
1027
|
+
const that = this;
|
|
1003
1028
|
if (typeof element === "string") {
|
|
1004
|
-
element =
|
|
1029
|
+
element = that.selector(element)!;
|
|
1005
1030
|
}
|
|
1006
1031
|
if (element == null) {
|
|
1007
1032
|
return;
|
|
1008
1033
|
}
|
|
1009
|
-
// if (DOMUtilsCommonUtils.isNodeList(element)) {
|
|
1010
|
-
// // 设置
|
|
1011
|
-
// element.forEach(($ele) => {
|
|
1012
|
-
// DOMUtilsContext.transitionend($ele as HTMLElement, handler, option);
|
|
1013
|
-
// });
|
|
1014
|
-
// return;
|
|
1015
|
-
// }
|
|
1016
1034
|
const defaultOption: DOMUtilsEventListenerOption = {
|
|
1017
1035
|
once: true,
|
|
1018
1036
|
};
|
|
1019
1037
|
Object.assign(defaultOption, option || {});
|
|
1020
|
-
const eventNameList =
|
|
1021
|
-
|
|
1038
|
+
const eventNameList = CommonUtils.getTransitionEndNameList();
|
|
1039
|
+
that.on(element, eventNameList, null, handler, defaultOption);
|
|
1022
1040
|
if (!defaultOption.once) {
|
|
1023
1041
|
return {
|
|
1024
1042
|
off() {
|
|
1025
|
-
|
|
1043
|
+
that.off(element, eventNameList, null, handler, defaultOption);
|
|
1026
1044
|
},
|
|
1027
1045
|
};
|
|
1028
1046
|
}
|
|
@@ -1047,21 +1065,21 @@ export class DOMUtilsEvent {
|
|
|
1047
1065
|
handler: (this: HTMLElement, event: DOMUtils_Event["keyup"]) => void,
|
|
1048
1066
|
option?: boolean | DOMUtilsEventListenerOption
|
|
1049
1067
|
) {
|
|
1050
|
-
const
|
|
1068
|
+
const that = this;
|
|
1051
1069
|
if (element == null) {
|
|
1052
1070
|
return;
|
|
1053
1071
|
}
|
|
1054
1072
|
if (typeof element === "string") {
|
|
1055
|
-
element =
|
|
1073
|
+
element = that.selectorAll(element);
|
|
1056
1074
|
}
|
|
1057
|
-
if (
|
|
1075
|
+
if (CommonUtils.isNodeList(element)) {
|
|
1058
1076
|
// 设置
|
|
1059
1077
|
element.forEach(($ele) => {
|
|
1060
|
-
|
|
1078
|
+
that.keyup($ele as HTMLElement, handler, option);
|
|
1061
1079
|
});
|
|
1062
1080
|
return;
|
|
1063
1081
|
}
|
|
1064
|
-
|
|
1082
|
+
that.on(element, "keyup", null, handler, option);
|
|
1065
1083
|
}
|
|
1066
1084
|
/**
|
|
1067
1085
|
* 当按键按下时触发事件
|
|
@@ -1083,21 +1101,21 @@ export class DOMUtilsEvent {
|
|
|
1083
1101
|
handler: (this: HTMLElement, event: DOMUtils_Event["keydown"]) => void,
|
|
1084
1102
|
option?: boolean | DOMUtilsEventListenerOption
|
|
1085
1103
|
) {
|
|
1086
|
-
const
|
|
1104
|
+
const that = this;
|
|
1087
1105
|
if (element == null) {
|
|
1088
1106
|
return;
|
|
1089
1107
|
}
|
|
1090
1108
|
if (typeof element === "string") {
|
|
1091
|
-
element =
|
|
1109
|
+
element = that.selectorAll(element);
|
|
1092
1110
|
}
|
|
1093
|
-
if (
|
|
1111
|
+
if (CommonUtils.isNodeList(element)) {
|
|
1094
1112
|
// 设置
|
|
1095
1113
|
element.forEach(($ele) => {
|
|
1096
|
-
|
|
1114
|
+
that.keydown($ele as HTMLElement, handler, option);
|
|
1097
1115
|
});
|
|
1098
1116
|
return;
|
|
1099
1117
|
}
|
|
1100
|
-
|
|
1118
|
+
that.on(element, "keydown", null, handler, option);
|
|
1101
1119
|
}
|
|
1102
1120
|
/**
|
|
1103
1121
|
* 当按键按下时触发事件
|
|
@@ -1119,21 +1137,21 @@ export class DOMUtilsEvent {
|
|
|
1119
1137
|
handler: (this: HTMLElement, event: DOMUtils_Event["keypress"]) => void,
|
|
1120
1138
|
option?: boolean | DOMUtilsEventListenerOption
|
|
1121
1139
|
) {
|
|
1122
|
-
const
|
|
1140
|
+
const that = this;
|
|
1123
1141
|
if (element == null) {
|
|
1124
1142
|
return;
|
|
1125
1143
|
}
|
|
1126
1144
|
if (typeof element === "string") {
|
|
1127
|
-
element =
|
|
1145
|
+
element = that.selectorAll(element);
|
|
1128
1146
|
}
|
|
1129
|
-
if (
|
|
1147
|
+
if (CommonUtils.isNodeList(element)) {
|
|
1130
1148
|
// 设置
|
|
1131
1149
|
element.forEach(($ele) => {
|
|
1132
|
-
|
|
1150
|
+
that.keypress($ele as HTMLElement, handler, option);
|
|
1133
1151
|
});
|
|
1134
1152
|
return;
|
|
1135
1153
|
}
|
|
1136
|
-
|
|
1154
|
+
that.on(element, "keypress", null, handler, option);
|
|
1137
1155
|
}
|
|
1138
1156
|
/**
|
|
1139
1157
|
* 监听某个元素键盘按键事件或window全局按键事件
|
|
@@ -1206,9 +1224,9 @@ export class DOMUtilsEvent {
|
|
|
1206
1224
|
): {
|
|
1207
1225
|
removeListen(): void;
|
|
1208
1226
|
} {
|
|
1209
|
-
const
|
|
1227
|
+
const that = this;
|
|
1210
1228
|
if (typeof element === "string") {
|
|
1211
|
-
element =
|
|
1229
|
+
element = that.selectorAll(element);
|
|
1212
1230
|
}
|
|
1213
1231
|
const keyboardEventCallBack = function (event: KeyboardEvent) {
|
|
1214
1232
|
/** 键名 */
|
|
@@ -1233,258 +1251,58 @@ export class DOMUtilsEvent {
|
|
|
1233
1251
|
callback(keyName, keyValue, otherCodeList, event);
|
|
1234
1252
|
}
|
|
1235
1253
|
};
|
|
1236
|
-
|
|
1254
|
+
that.on(element, eventName, keyboardEventCallBack, options);
|
|
1237
1255
|
return {
|
|
1238
1256
|
removeListen: () => {
|
|
1239
|
-
|
|
1257
|
+
that.off(element, eventName, keyboardEventCallBack, options);
|
|
1240
1258
|
},
|
|
1241
1259
|
};
|
|
1242
1260
|
}
|
|
1243
1261
|
/**
|
|
1244
|
-
*
|
|
1245
|
-
*
|
|
1246
|
-
* + :contains([text]) 作用: 找到包含指定文本内容的指定元素
|
|
1247
|
-
* + :empty 作用:找到既没有文本内容也没有子元素的指定元素
|
|
1248
|
-
* + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
|
|
1249
|
-
* @param selector 选择器
|
|
1250
|
-
* @param parent 指定父元素
|
|
1251
|
-
* @example
|
|
1252
|
-
* DOMUtils.selector("div:contains('测试')")
|
|
1253
|
-
* > div.xxx
|
|
1254
|
-
* @example
|
|
1255
|
-
* DOMUtils.selector("div:empty")
|
|
1256
|
-
* > div.xxx
|
|
1257
|
-
* @example
|
|
1258
|
-
* DOMUtils.selector("div:regexp('^xxxx$')")
|
|
1259
|
-
* > div.xxx
|
|
1260
|
-
*/
|
|
1261
|
-
selector<K extends keyof HTMLElementTagNameMap>(
|
|
1262
|
-
selector: K,
|
|
1263
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1264
|
-
): HTMLElementTagNameMap[K] | undefined;
|
|
1265
|
-
selector<E extends Element = HTMLElement>(
|
|
1266
|
-
selector: string,
|
|
1267
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1268
|
-
): E | undefined;
|
|
1269
|
-
selector<E extends Element = HTMLElement>(
|
|
1270
|
-
selector: string,
|
|
1271
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1272
|
-
) {
|
|
1273
|
-
return this.selectorAll<E>(selector, parent)[0];
|
|
1274
|
-
}
|
|
1275
|
-
/**
|
|
1276
|
-
* 选择器,可使用以下的额外语法
|
|
1277
|
-
*
|
|
1278
|
-
* + :contains([text]) 作用: 找到包含指定文本内容的指定元素
|
|
1279
|
-
* + :empty 作用:找到既没有文本内容也没有子元素的指定元素
|
|
1280
|
-
* + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
|
|
1281
|
-
* @param selector 选择器
|
|
1282
|
-
* @param parent 指定父元素
|
|
1283
|
-
* @example
|
|
1284
|
-
* DOMUtils.selectorAll("div:contains('测试')")
|
|
1285
|
-
* > [div.xxx]
|
|
1286
|
-
* @example
|
|
1287
|
-
* DOMUtils.selectorAll("div:empty")
|
|
1288
|
-
* > [div.xxx]
|
|
1262
|
+
* 阻止事件传递
|
|
1263
|
+
* @param event 要阻止传递的事件
|
|
1289
1264
|
* @example
|
|
1290
|
-
* DOMUtils.
|
|
1291
|
-
* > [div.xxx]
|
|
1292
|
-
* @example
|
|
1293
|
-
* DOMUtils.selectorAll("div:regexp(/^xxx/ig)")
|
|
1294
|
-
* > [div.xxx]
|
|
1265
|
+
* DOMUtils.preventEvent(event);
|
|
1295
1266
|
*/
|
|
1296
|
-
|
|
1297
|
-
selector: K,
|
|
1298
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1299
|
-
): HTMLElementTagNameMap[K][];
|
|
1300
|
-
selectorAll<E extends Element = HTMLElement>(
|
|
1301
|
-
selector: string,
|
|
1302
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1303
|
-
): E[];
|
|
1304
|
-
selectorAll<E extends Element = HTMLElement>(
|
|
1305
|
-
selector: string,
|
|
1306
|
-
parent?: Element | Document | DocumentFragment | ShadowRoot
|
|
1307
|
-
) {
|
|
1308
|
-
const context = this;
|
|
1309
|
-
parent = parent || context.windowApi.document;
|
|
1310
|
-
selector = selector.trim();
|
|
1311
|
-
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
1312
|
-
// empty 语法
|
|
1313
|
-
selector = selector.replace(/:empty$/gi, "");
|
|
1314
|
-
return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
|
|
1315
|
-
return $ele?.innerHTML?.trim() === "";
|
|
1316
|
-
});
|
|
1317
|
-
} else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
1318
|
-
// contains 语法
|
|
1319
|
-
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
1320
|
-
const text = textMatch![2];
|
|
1321
|
-
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
1322
|
-
return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
|
|
1323
|
-
// @ts-ignore
|
|
1324
|
-
return ($ele?.textContent || $ele?.innerText)?.includes(text);
|
|
1325
|
-
});
|
|
1326
|
-
} else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
1327
|
-
// regexp 语法
|
|
1328
|
-
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
1329
|
-
let pattern = textMatch![2];
|
|
1330
|
-
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
1331
|
-
let flags = "";
|
|
1332
|
-
if (flagMatch) {
|
|
1333
|
-
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
1334
|
-
flags = flagMatch[3];
|
|
1335
|
-
}
|
|
1336
|
-
const regexp = new RegExp(pattern, flags);
|
|
1337
|
-
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
1338
|
-
return Array.from(parent.querySelectorAll<E>(selector)).filter(($ele) => {
|
|
1339
|
-
// @ts-ignore
|
|
1340
|
-
return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
|
|
1341
|
-
});
|
|
1342
|
-
} else {
|
|
1343
|
-
// 普通语法
|
|
1344
|
-
return Array.from(parent.querySelectorAll<E>(selector));
|
|
1345
|
-
}
|
|
1346
|
-
}
|
|
1267
|
+
preventEvent(event: Event): boolean;
|
|
1347
1268
|
/**
|
|
1348
|
-
*
|
|
1349
|
-
*
|
|
1350
|
-
*
|
|
1351
|
-
*
|
|
1352
|
-
* + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
|
|
1353
|
-
* @param $el 元素
|
|
1354
|
-
* @param selector 选择器
|
|
1269
|
+
* 通过监听事件来主动阻止事件的传递
|
|
1270
|
+
* @param $el 要进行处理的元素
|
|
1271
|
+
* @param eventNameList (可选)要阻止的事件名|列表
|
|
1272
|
+
* @param capture (可选)是否捕获,默认false
|
|
1355
1273
|
* @example
|
|
1356
|
-
* DOMUtils.
|
|
1357
|
-
* > true
|
|
1358
|
-
* @example
|
|
1359
|
-
* DOMUtils.matches("div:empty")
|
|
1360
|
-
* > true
|
|
1361
|
-
* @example
|
|
1362
|
-
* DOMUtils.matches("div:regexp('^xxxx$')")
|
|
1363
|
-
* > true
|
|
1364
|
-
* @example
|
|
1365
|
-
* DOMUtils.matches("div:regexp(/^xxx/ig)")
|
|
1366
|
-
* > false
|
|
1274
|
+
* DOMUtils.preventEvent(document.querySelector("a"),"click")
|
|
1367
1275
|
*/
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1276
|
+
preventEvent($el: HTMLElement, eventNameList?: string | string[], capture?: boolean): void;
|
|
1277
|
+
preventEvent(...args: any[]) {
|
|
1278
|
+
/**
|
|
1279
|
+
* 阻止事件的默认行为发生,并阻止事件传播
|
|
1280
|
+
*/
|
|
1281
|
+
const stopEvent = (event: Event) => {
|
|
1282
|
+
/* 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL */
|
|
1283
|
+
event?.preventDefault();
|
|
1284
|
+
/* 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素 */
|
|
1285
|
+
event?.stopPropagation();
|
|
1286
|
+
/* 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发 */
|
|
1287
|
+
event?.stopImmediatePropagation();
|
|
1371
1288
|
return false;
|
|
1372
|
-
}
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
selector = selector.replace(/:empty$/gi, "");
|
|
1377
|
-
return $el.matches(selector) && $el?.innerHTML?.trim() === "";
|
|
1378
|
-
} else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
1379
|
-
// contains 语法
|
|
1380
|
-
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
1381
|
-
const text = textMatch![2];
|
|
1382
|
-
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
1383
|
-
// @ts-ignore
|
|
1384
|
-
let content = $el?.textContent || $el?.innerText;
|
|
1385
|
-
if (typeof content !== "string") {
|
|
1386
|
-
content = "";
|
|
1387
|
-
}
|
|
1388
|
-
return $el.matches(selector) && content?.includes(text);
|
|
1389
|
-
} else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
1390
|
-
// regexp 语法
|
|
1391
|
-
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
1392
|
-
let pattern = textMatch![2];
|
|
1393
|
-
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
1394
|
-
let flags = "";
|
|
1395
|
-
if (flagMatch) {
|
|
1396
|
-
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
1397
|
-
flags = flagMatch[3];
|
|
1398
|
-
}
|
|
1399
|
-
const regexp = new RegExp(pattern, flags);
|
|
1400
|
-
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
1401
|
-
// @ts-ignore
|
|
1402
|
-
let content = $el?.textContent || $el?.innerText;
|
|
1403
|
-
if (typeof content !== "string") {
|
|
1404
|
-
content = "";
|
|
1405
|
-
}
|
|
1406
|
-
return $el.matches(selector) && Boolean(content?.match(regexp));
|
|
1289
|
+
};
|
|
1290
|
+
if (args.length === 1) {
|
|
1291
|
+
/* 直接阻止事件 */
|
|
1292
|
+
return stopEvent(args[0]);
|
|
1407
1293
|
} else {
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
*
|
|
1415
|
-
* + :contains([text]) 作用: 找到包含指定文本内容的指定元素
|
|
1416
|
-
* + :empty 作用:找到既没有文本内容也没有子元素的指定元素
|
|
1417
|
-
* + :regexp([text]) 作用: 找到符合正则表达式的内容的指定元素
|
|
1418
|
-
* @param $el 元素
|
|
1419
|
-
* @param selector 选择器
|
|
1420
|
-
* @example
|
|
1421
|
-
* DOMUtils.closest("div:contains('测试')")
|
|
1422
|
-
* > div.xxx
|
|
1423
|
-
* @example
|
|
1424
|
-
* DOMUtils.closest("div:empty")
|
|
1425
|
-
* > div.xxx
|
|
1426
|
-
* @example
|
|
1427
|
-
* DOMUtils.closest("div:regexp('^xxxx$')")
|
|
1428
|
-
* > div.xxxx
|
|
1429
|
-
* @example
|
|
1430
|
-
* DOMUtils.closest("div:regexp(/^xxx/ig)")
|
|
1431
|
-
* > null
|
|
1432
|
-
*/
|
|
1433
|
-
closest<K extends keyof HTMLElementTagNameMap>(
|
|
1434
|
-
$el: HTMLElement | Element,
|
|
1435
|
-
selector: string
|
|
1436
|
-
): HTMLElementTagNameMap[K] | null;
|
|
1437
|
-
closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null;
|
|
1438
|
-
closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null {
|
|
1439
|
-
selector = selector.trim();
|
|
1440
|
-
|
|
1441
|
-
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
1442
|
-
// empty 语法
|
|
1443
|
-
selector = selector.replace(/:empty$/gi, "");
|
|
1444
|
-
const $closest = $el?.closest<E>(selector);
|
|
1445
|
-
if ($closest && $closest?.innerHTML?.trim() === "") {
|
|
1446
|
-
return $closest;
|
|
1294
|
+
const $el: HTMLElement = args[0];
|
|
1295
|
+
let eventNameList: string | string[] = args[1];
|
|
1296
|
+
const capture: boolean = args[2];
|
|
1297
|
+
/* 添加对应的事件来阻止触发 */
|
|
1298
|
+
if (typeof eventNameList === "string") {
|
|
1299
|
+
eventNameList = [eventNameList];
|
|
1447
1300
|
}
|
|
1448
|
-
|
|
1449
|
-
} else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
1450
|
-
// contains 语法
|
|
1451
|
-
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
1452
|
-
const text = textMatch![2];
|
|
1453
|
-
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
1454
|
-
const $closest = $el?.closest<E>(selector);
|
|
1455
|
-
if ($closest) {
|
|
1456
|
-
// @ts-ignore
|
|
1457
|
-
const content = $el?.textContent || $el?.innerText;
|
|
1458
|
-
if (typeof content === "string" && content.includes(text)) {
|
|
1459
|
-
return $closest;
|
|
1460
|
-
}
|
|
1461
|
-
}
|
|
1462
|
-
return null;
|
|
1463
|
-
} else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
1464
|
-
// regexp 语法
|
|
1465
|
-
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
1466
|
-
let pattern = textMatch![2];
|
|
1467
|
-
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
1468
|
-
let flags = "";
|
|
1469
|
-
if (flagMatch) {
|
|
1470
|
-
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
1471
|
-
flags = flagMatch[3];
|
|
1472
|
-
}
|
|
1473
|
-
const regexp = new RegExp(pattern, flags);
|
|
1474
|
-
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
1475
|
-
const $closest = $el?.closest<E>(selector);
|
|
1476
|
-
if ($closest) {
|
|
1477
|
-
// @ts-ignore
|
|
1478
|
-
const content = $el?.textContent || $el?.innerText;
|
|
1479
|
-
if (typeof content === "string" && content.match(regexp)) {
|
|
1480
|
-
return $closest;
|
|
1481
|
-
}
|
|
1482
|
-
}
|
|
1483
|
-
return null;
|
|
1484
|
-
} else {
|
|
1485
|
-
// 普通语法
|
|
1486
|
-
const $closest = $el?.closest<E>(selector);
|
|
1487
|
-
return $closest;
|
|
1301
|
+
this.on($el, eventNameList, stopEvent, { capture: Boolean(capture) });
|
|
1488
1302
|
}
|
|
1489
1303
|
}
|
|
1490
1304
|
}
|
|
1305
|
+
|
|
1306
|
+
const elementEvent = new ElementEvent();
|
|
1307
|
+
|
|
1308
|
+
export { elementEvent, ElementEvent };
|