@whitesev/domutils 1.5.5 → 1.5.7

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.
@@ -2,11 +2,6 @@ import { DOMUtilsEvent } from "./DOMUtilsEvent";
2
2
  import type { DOMUtilsCreateElementAttributesMap } from "./types/DOMUtilsEvent";
3
3
  import { ParseHTMLReturnType, type DOMUtilsTargetElementType } from "./types/global";
4
4
  import type { WindowApiOption } from "./types/WindowApi";
5
- /**
6
- * 判断是否是元素列表
7
- * @param $ele
8
- */
9
- export declare const isNodeList: ($ele: any) => $ele is any[] | NodeList;
10
5
  declare class DOMUtils extends DOMUtilsEvent {
11
6
  constructor(option?: WindowApiOption);
12
7
  /** 版本号 */
@@ -72,7 +67,7 @@ declare class DOMUtils extends DOMUtilsEvent {
72
67
  * DOMUtils.css("a.xx","display");
73
68
  * > "none"
74
69
  * */
75
- css(element: DOMUtilsTargetElementType, property: keyof CSSStyleDeclaration): string;
70
+ css(element: DOMUtilsTargetElementType, property: keyof Omit<CSSStyleDeclaration, "zIndex"> | "z-index"): string;
76
71
  /**
77
72
  * 获取元素的样式属性值
78
73
  * @param element 目标元素
@@ -100,7 +95,7 @@ declare class DOMUtils extends DOMUtilsEvent {
100
95
  * DOMUtils.css(document.querySelector("a.xx"),"top","10px");
101
96
  * DOMUtils.css(document.querySelector("a.xx"),"top",10);
102
97
  * */
103
- css(element: DOMUtilsTargetElementType, property: keyof CSSStyleDeclaration & string, value: string | number): string;
98
+ css(element: DOMUtilsTargetElementType, property: (keyof Omit<CSSStyleDeclaration, "zIndex"> | "z-index") & string, value: string | number): string;
104
99
  /**
105
100
  * 设置元素的样式属性
106
101
  * @param element 目标元素
@@ -116,7 +111,9 @@ declare class DOMUtils extends DOMUtilsEvent {
116
111
  * DOMUtils.css(document.querySelector("a.xx"),{ top: 10 });
117
112
  * */
118
113
  css(element: DOMUtilsTargetElementType, property: {
119
- [P in keyof CSSStyleDeclaration]?: CSSStyleDeclaration[P];
114
+ [P in keyof Omit<CSSStyleDeclaration, "zIndex">]?: CSSStyleDeclaration[P];
115
+ } | {
116
+ "z-index": string | number;
120
117
  } | {
121
118
  [key: string]: string | number;
122
119
  }): string;
@@ -60,5 +60,10 @@ declare const DOMUtilsCommonUtils: {
60
60
  * 配合 .setInterval 使用
61
61
  */
62
62
  clearInterval(timeId: number | undefined): void;
63
+ /**
64
+ * 判断是否是元素列表
65
+ * @param $ele
66
+ */
67
+ isNodeList($ele: any): $ele is any[] | NodeList;
63
68
  };
64
69
  export { DOMUtilsCommonUtils };
@@ -417,4 +417,13 @@ export declare class DOMUtilsEvent {
417
417
  */
418
418
  selectorAll<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K][];
419
419
  selectorAll<E extends Element = Element>(selector: string): E[];
420
+ /**
421
+ * 匹配元素,可使用以下的额外语法
422
+ */
423
+ matches($el: HTMLElement | Element | null | undefined, selector: string): boolean;
424
+ /**
425
+ * 根据选择器获取上层元素,可使用以下的额外语法
426
+ */
427
+ closest<K extends keyof HTMLElementTagNameMap>($el: HTMLElement | Element, selector: string): HTMLElementTagNameMap[K] | null;
428
+ closest<E extends Element = Element>($el: HTMLElement | Element, selector: string): E | null;
420
429
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whitesev/domutils",
3
- "version": "1.5.5",
3
+ "version": "1.5.7",
4
4
  "description": "使用js重新对jQuery的部分函数进行了仿写",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
package/src/DOMUtils.ts CHANGED
@@ -7,20 +7,12 @@ import {
7
7
  } from "./types/global";
8
8
  import type { WindowApiOption } from "./types/WindowApi";
9
9
 
10
- /**
11
- * 判断是否是元素列表
12
- * @param $ele
13
- */
14
- export const isNodeList = ($ele: any): $ele is any[] | NodeList => {
15
- return Array.isArray($ele) || $ele instanceof NodeList;
16
- };
17
-
18
10
  class DOMUtils extends DOMUtilsEvent {
19
11
  constructor(option?: WindowApiOption) {
20
12
  super(option);
21
13
  }
22
14
  /** 版本号 */
23
- version = "2025.5.26";
15
+ version = "2025.5.30";
24
16
  /**
25
17
  * 获取元素的属性值
26
18
  * @param element 目标元素
@@ -55,7 +47,7 @@ class DOMUtils extends DOMUtilsEvent {
55
47
  if (element == null) {
56
48
  return;
57
49
  }
58
- if (isNodeList(element)) {
50
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
59
51
  if (attrValue == null) {
60
52
  // 获取属性
61
53
  return DOMUtilsContext.attr(
@@ -155,7 +147,7 @@ class DOMUtils extends DOMUtilsEvent {
155
147
  * */
156
148
  css(
157
149
  element: DOMUtilsTargetElementType,
158
- property: keyof CSSStyleDeclaration
150
+ property: keyof Omit<CSSStyleDeclaration, "zIndex"> | "z-index"
159
151
  ): string;
160
152
  /**
161
153
  * 获取元素的样式属性值
@@ -186,7 +178,7 @@ class DOMUtils extends DOMUtilsEvent {
186
178
  * */
187
179
  css(
188
180
  element: DOMUtilsTargetElementType,
189
- property: keyof CSSStyleDeclaration & string,
181
+ property: (keyof Omit<CSSStyleDeclaration, "zIndex"> | "z-index") & string,
190
182
  value: string | number
191
183
  ): string;
192
184
  /**
@@ -207,7 +199,13 @@ class DOMUtils extends DOMUtilsEvent {
207
199
  element: DOMUtilsTargetElementType,
208
200
  property:
209
201
  | {
210
- [P in keyof CSSStyleDeclaration]?: CSSStyleDeclaration[P];
202
+ [P in keyof Omit<
203
+ CSSStyleDeclaration,
204
+ "zIndex"
205
+ >]?: CSSStyleDeclaration[P];
206
+ }
207
+ | {
208
+ "z-index": string | number;
211
209
  }
212
210
  | {
213
211
  [key: string]: string | number;
@@ -216,10 +214,10 @@ class DOMUtils extends DOMUtilsEvent {
216
214
  css(
217
215
  element: DOMUtilsTargetElementType,
218
216
  property:
219
- | keyof CSSStyleDeclaration
217
+ | keyof Omit<CSSStyleDeclaration, "zIndex">
220
218
  | string
221
219
  | {
222
- [P in keyof CSSStyleDeclaration]?:
220
+ [P in keyof Omit<CSSStyleDeclaration, "zIndex">]?:
223
221
  | string
224
222
  | number
225
223
  | CSSStyleDeclaration[P];
@@ -258,7 +256,7 @@ class DOMUtils extends DOMUtilsEvent {
258
256
  if (element == null) {
259
257
  return;
260
258
  }
261
- if (isNodeList(element)) {
259
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
262
260
  if (typeof property === "string") {
263
261
  if (value == null) {
264
262
  // 获取属性
@@ -350,7 +348,7 @@ class DOMUtils extends DOMUtilsEvent {
350
348
  if (element == null) {
351
349
  return;
352
350
  }
353
- if (isNodeList(element)) {
351
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
354
352
  if (text == null) {
355
353
  // 获取
356
354
  return DOMUtilsContext.text(element[0] as HTMLElement);
@@ -411,7 +409,7 @@ class DOMUtils extends DOMUtilsEvent {
411
409
  if (element == null) {
412
410
  return;
413
411
  }
414
- if (isNodeList(element)) {
412
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
415
413
  if (html == null) {
416
414
  // 获取
417
415
  return DOMUtilsContext.html(element[0] as HTMLElement);
@@ -550,7 +548,7 @@ class DOMUtils extends DOMUtilsEvent {
550
548
  if (element == null) {
551
549
  return;
552
550
  }
553
- if (isNodeList(element)) {
551
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
554
552
  if (value == null) {
555
553
  // 获取
556
554
  return DOMUtilsContext.val(element[0] as HTMLInputElement);
@@ -620,7 +618,7 @@ class DOMUtils extends DOMUtilsEvent {
620
618
  if (element == null) {
621
619
  return;
622
620
  }
623
- if (isNodeList(element)) {
621
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
624
622
  if (propValue == null) {
625
623
  // 获取
626
624
  return DOMUtilsContext.prop(element[0] as HTMLElement, propName);
@@ -659,7 +657,7 @@ class DOMUtils extends DOMUtilsEvent {
659
657
  if (element == null) {
660
658
  return;
661
659
  }
662
- if (isNodeList(element)) {
660
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
663
661
  // 设置
664
662
  element.forEach(($ele) => {
665
663
  DOMUtilsContext.removeAttr($ele as HTMLElement, attrName);
@@ -688,7 +686,7 @@ class DOMUtils extends DOMUtilsEvent {
688
686
  if (element == null) {
689
687
  return;
690
688
  }
691
- if (isNodeList(element)) {
689
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
692
690
  // 设置
693
691
  element.forEach(($ele) => {
694
692
  DOMUtilsContext.removeClass($ele as HTMLElement, className);
@@ -724,7 +722,7 @@ class DOMUtils extends DOMUtilsEvent {
724
722
  if (element == null) {
725
723
  return;
726
724
  }
727
- if (isNodeList(element)) {
725
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
728
726
  // 设置
729
727
  element.forEach(($ele) => {
730
728
  DOMUtilsContext.removeProp($ele as HTMLElement, propName);
@@ -753,7 +751,7 @@ class DOMUtils extends DOMUtilsEvent {
753
751
  if (element == null) {
754
752
  return;
755
753
  }
756
- if (isNodeList(element)) {
754
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
757
755
  // 设置
758
756
  element.forEach(($ele) => {
759
757
  DOMUtilsContext.replaceWith($ele as HTMLElement, newElement);
@@ -782,7 +780,7 @@ class DOMUtils extends DOMUtilsEvent {
782
780
  if (element == null) {
783
781
  return;
784
782
  }
785
- if (isNodeList(element)) {
783
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
786
784
  // 设置
787
785
  element.forEach(($ele) => {
788
786
  DOMUtilsContext.addClass($ele as HTMLElement, className);
@@ -815,7 +813,7 @@ class DOMUtils extends DOMUtilsEvent {
815
813
  if (element == null) {
816
814
  return false;
817
815
  }
818
- if (isNodeList(element)) {
816
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
819
817
  let flag = true;
820
818
  for (let index = 0; index < element.length; index++) {
821
819
  const $ele = element[index] as HTMLElement;
@@ -862,7 +860,7 @@ class DOMUtils extends DOMUtilsEvent {
862
860
  return;
863
861
  }
864
862
 
865
- if (isNodeList(element)) {
863
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
866
864
  // 设置
867
865
  element.forEach(($ele) => {
868
866
  DOMUtilsContext.append($ele as HTMLElement, content);
@@ -911,7 +909,7 @@ class DOMUtils extends DOMUtilsEvent {
911
909
  if (element == null) {
912
910
  return;
913
911
  }
914
- if (isNodeList(element)) {
912
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
915
913
  // 设置
916
914
  element.forEach(($ele) => {
917
915
  DOMUtilsContext.prepend($ele as HTMLElement, content);
@@ -949,7 +947,7 @@ class DOMUtils extends DOMUtilsEvent {
949
947
  if (element == null) {
950
948
  return;
951
949
  }
952
- if (isNodeList(element)) {
950
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
953
951
  // 设置
954
952
  element.forEach(($ele) => {
955
953
  DOMUtilsContext.after($ele as HTMLElement, content);
@@ -989,7 +987,7 @@ class DOMUtils extends DOMUtilsEvent {
989
987
  if (element == null) {
990
988
  return;
991
989
  }
992
- if (isNodeList(element)) {
990
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
993
991
  // 设置
994
992
  element.forEach(($ele) => {
995
993
  DOMUtilsContext.before($ele as HTMLElement, content);
@@ -1027,7 +1025,7 @@ class DOMUtils extends DOMUtilsEvent {
1027
1025
  if (element == null) {
1028
1026
  return;
1029
1027
  }
1030
- if (isNodeList(element)) {
1028
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1031
1029
  element.forEach(($ele) => {
1032
1030
  DOMUtilsContext.remove($ele as HTMLElement);
1033
1031
  });
@@ -1051,7 +1049,7 @@ class DOMUtils extends DOMUtilsEvent {
1051
1049
  if (element == null) {
1052
1050
  return;
1053
1051
  }
1054
- if (isNodeList(element)) {
1052
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1055
1053
  // 设置
1056
1054
  element.forEach(($ele) => {
1057
1055
  DOMUtilsContext.empty($ele as HTMLElement);
@@ -1419,7 +1417,7 @@ class DOMUtils extends DOMUtilsEvent {
1419
1417
  if (element == null) {
1420
1418
  return;
1421
1419
  }
1422
- if (isNodeList(element)) {
1420
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1423
1421
  // 设置
1424
1422
  element.forEach(($ele) => {
1425
1423
  DOMUtilsContext.animate(
@@ -1490,7 +1488,7 @@ class DOMUtils extends DOMUtilsEvent {
1490
1488
  if (element == null) {
1491
1489
  return;
1492
1490
  }
1493
- if (isNodeList(element)) {
1491
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1494
1492
  // 设置
1495
1493
  element.forEach(($ele) => {
1496
1494
  DOMUtilsContext.wrap($ele as HTMLElement, wrapperHTML);
@@ -1630,7 +1628,7 @@ class DOMUtils extends DOMUtilsEvent {
1630
1628
  if (element == null) {
1631
1629
  return;
1632
1630
  }
1633
- if (isNodeList(element)) {
1631
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1634
1632
  let resultArray: HTMLElement[] = [];
1635
1633
  element.forEach(($ele) => {
1636
1634
  resultArray.push(DOMUtilsContext.parent($ele as HTMLElement));
@@ -1854,7 +1852,7 @@ class DOMUtils extends DOMUtilsEvent {
1854
1852
  if (typeof element === "string") {
1855
1853
  element = DOMUtilsContext.selectorAll(element);
1856
1854
  }
1857
- if (isNodeList(element)) {
1855
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1858
1856
  // 设置
1859
1857
  element.forEach(($ele) => {
1860
1858
  DOMUtilsContext.fadeIn($ele as HTMLElement, duration, callback);
@@ -1907,7 +1905,7 @@ class DOMUtils extends DOMUtilsEvent {
1907
1905
  if (typeof element === "string") {
1908
1906
  element = DOMUtilsContext.selectorAll(element);
1909
1907
  }
1910
- if (isNodeList(element)) {
1908
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1911
1909
  // 设置
1912
1910
  element.forEach(($ele) => {
1913
1911
  DOMUtilsContext.fadeOut($ele as HTMLElement, duration, callback);
@@ -1951,7 +1949,7 @@ class DOMUtils extends DOMUtilsEvent {
1951
1949
  if (element == null) {
1952
1950
  return;
1953
1951
  }
1954
- if (isNodeList(element)) {
1952
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1955
1953
  // 设置
1956
1954
  element.forEach(($ele) => {
1957
1955
  DOMUtilsContext.toggle($ele as HTMLElement);
@@ -184,5 +184,12 @@ const DOMUtilsCommonUtils = {
184
184
  globalThis.clearInterval(timeId);
185
185
  }
186
186
  },
187
+ /**
188
+ * 判断是否是元素列表
189
+ * @param $ele
190
+ */
191
+ isNodeList($ele: any): $ele is any[] | NodeList {
192
+ return Array.isArray($ele) || $ele instanceof NodeList;
193
+ },
187
194
  };
188
195
  export { DOMUtilsCommonUtils };
@@ -1,4 +1,3 @@
1
- import { isNodeList } from "./DOMUtils";
2
1
  import { DOMUtilsCommonUtils } from "./DOMUtilsCommonUtils";
3
2
  import { DOMUtilsData } from "./DOMUtilsData";
4
3
  import { OriginPrototype } from "./DOMUtilsOriginPrototype";
@@ -279,13 +278,15 @@ export class DOMUtilsEvent {
279
278
  : elementItem;
280
279
  let findValue = selectorList.find((selectorItem) => {
281
280
  // 判断目标元素是否匹配选择器
282
- if (eventTarget?.matches(selectorItem)) {
281
+ if (DOMUtilsContext.matches(eventTarget, selectorItem)) {
283
282
  /* 当前目标可以被selector所匹配到 */
284
283
  return true;
285
284
  }
286
285
  /* 在上层与主元素之间寻找可以被selector所匹配到的 */
287
- let $closestMatches =
288
- eventTarget?.closest<HTMLElement>(selectorItem);
286
+ let $closestMatches = DOMUtilsContext.closest<HTMLElement>(
287
+ eventTarget,
288
+ selectorItem
289
+ );
289
290
  if ($closestMatches && totalParent?.contains($closestMatches)) {
290
291
  eventTarget = $closestMatches;
291
292
  return true;
@@ -910,7 +911,7 @@ export class DOMUtilsEvent {
910
911
  if (element == null) {
911
912
  return;
912
913
  }
913
- if (isNodeList(element)) {
914
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
914
915
  // 设置
915
916
  element.forEach(($ele) => {
916
917
  DOMUtilsContext.click(
@@ -960,7 +961,7 @@ export class DOMUtilsEvent {
960
961
  if (element == null) {
961
962
  return;
962
963
  }
963
- if (isNodeList(element)) {
964
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
964
965
  // 设置
965
966
  element.forEach(($ele) => {
966
967
  DOMUtilsContext.focus(
@@ -1015,7 +1016,7 @@ export class DOMUtilsEvent {
1015
1016
  if (element == null) {
1016
1017
  return;
1017
1018
  }
1018
- if (isNodeList(element)) {
1019
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1019
1020
  // 设置
1020
1021
  element.forEach(($ele) => {
1021
1022
  DOMUtilsContext.focus(
@@ -1064,7 +1065,7 @@ export class DOMUtilsEvent {
1064
1065
  if (element == null) {
1065
1066
  return;
1066
1067
  }
1067
- if (isNodeList(element)) {
1068
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1068
1069
  // 设置
1069
1070
  element.forEach(($ele) => {
1070
1071
  DOMUtilsContext.hover($ele as HTMLElement, handler, option);
@@ -1101,7 +1102,7 @@ export class DOMUtilsEvent {
1101
1102
  if (typeof element === "string") {
1102
1103
  element = DOMUtilsContext.selectorAll(element);
1103
1104
  }
1104
- if (isNodeList(element)) {
1105
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1105
1106
  // 设置
1106
1107
  element.forEach(($ele) => {
1107
1108
  DOMUtilsContext.keyup($ele as HTMLElement, handler, option);
@@ -1137,7 +1138,7 @@ export class DOMUtilsEvent {
1137
1138
  if (typeof element === "string") {
1138
1139
  element = DOMUtilsContext.selectorAll(element);
1139
1140
  }
1140
- if (isNodeList(element)) {
1141
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1141
1142
  // 设置
1142
1143
  element.forEach(($ele) => {
1143
1144
  DOMUtilsContext.keydown($ele as HTMLElement, handler, option);
@@ -1173,7 +1174,7 @@ export class DOMUtilsEvent {
1173
1174
  if (typeof element === "string") {
1174
1175
  element = DOMUtilsContext.selectorAll(element);
1175
1176
  }
1176
- if (isNodeList(element)) {
1177
+ if (DOMUtilsCommonUtils.isNodeList(element)) {
1177
1178
  // 设置
1178
1179
  element.forEach(($ele) => {
1179
1180
  DOMUtilsContext.keypress($ele as HTMLElement, handler, option);
@@ -1394,4 +1395,132 @@ export class DOMUtilsEvent {
1394
1395
  );
1395
1396
  }
1396
1397
  }
1398
+ /**
1399
+ * 匹配元素,可使用以下的额外语法
1400
+ */
1401
+ matches(
1402
+ $el: HTMLElement | Element | null | undefined,
1403
+ selector: string
1404
+ ): boolean {
1405
+ selector = selector.trim();
1406
+ if ($el == null) {
1407
+ return false;
1408
+ }
1409
+
1410
+ if (selector.match(/[^\s]{1}:empty$/gi)) {
1411
+ // empty 语法
1412
+ selector = selector.replace(/:empty$/gi, "");
1413
+ return $el.matches(selector) && $el?.innerHTML?.trim() === "";
1414
+ } else if (
1415
+ selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
1416
+ selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)
1417
+ ) {
1418
+ // contains 语法
1419
+ let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1420
+ let text = textMatch![2];
1421
+ selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1422
+ // @ts-ignore
1423
+ let content = $el?.textContent || $el?.innerText;
1424
+ if (typeof content !== "string") {
1425
+ content = "";
1426
+ }
1427
+ return $el.matches(selector) && content?.includes(text);
1428
+ } else if (
1429
+ selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
1430
+ selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)
1431
+ ) {
1432
+ // regexp 语法
1433
+ let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1434
+ let pattern = textMatch![2];
1435
+ let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1436
+ let flags = "";
1437
+ if (flagMatch) {
1438
+ pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1439
+ flags = flagMatch[3];
1440
+ }
1441
+ let regexp = new RegExp(pattern, flags);
1442
+ selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1443
+ // @ts-ignore
1444
+ let content = $el?.textContent || $el?.innerText;
1445
+ if (typeof content !== "string") {
1446
+ content = "";
1447
+ }
1448
+ return $el.matches(selector) && Boolean(content?.match(regexp));
1449
+ } else {
1450
+ // 普通语法
1451
+ return $el.matches(selector);
1452
+ }
1453
+ }
1454
+ /**
1455
+ * 根据选择器获取上层元素,可使用以下的额外语法
1456
+ */
1457
+ closest<K extends keyof HTMLElementTagNameMap>(
1458
+ $el: HTMLElement | Element,
1459
+ selector: string
1460
+ ): HTMLElementTagNameMap[K] | null;
1461
+ closest<E extends Element = Element>(
1462
+ $el: HTMLElement | Element,
1463
+ selector: string
1464
+ ): E | null;
1465
+ closest<E extends Element = Element>(
1466
+ $el: HTMLElement | Element,
1467
+ selector: string
1468
+ ): E | null {
1469
+ selector = selector.trim();
1470
+
1471
+ if (selector.match(/[^\s]{1}:empty$/gi)) {
1472
+ // empty 语法
1473
+ selector = selector.replace(/:empty$/gi, "");
1474
+ let $closest = $el?.closest<E>(selector);
1475
+ if ($closest && $closest?.innerHTML?.trim() === "") {
1476
+ return $closest;
1477
+ }
1478
+ return null;
1479
+ } else if (
1480
+ selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
1481
+ selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)
1482
+ ) {
1483
+ // contains 语法
1484
+ let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
1485
+ let text = textMatch![2];
1486
+ selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
1487
+ let $closest = $el?.closest<E>(selector);
1488
+ if ($closest) {
1489
+ // @ts-ignore
1490
+ let content = $el?.textContent || $el?.innerText;
1491
+ if (typeof content === "string" && content.includes(text)) {
1492
+ return $closest;
1493
+ }
1494
+ }
1495
+ return null;
1496
+ } else if (
1497
+ selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
1498
+ selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)
1499
+ ) {
1500
+ // regexp 语法
1501
+ let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
1502
+ let pattern = textMatch![2];
1503
+ let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
1504
+ let flags = "";
1505
+ if (flagMatch) {
1506
+ pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
1507
+ flags = flagMatch[3];
1508
+ }
1509
+ let regexp = new RegExp(pattern, flags);
1510
+ selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
1511
+ let $closest = $el?.closest<E>(selector);
1512
+ if ($closest) {
1513
+ // @ts-ignore
1514
+ let content = $el?.textContent || $el?.innerText;
1515
+ if (typeof content === "string" && content.match(regexp)) {
1516
+ return $closest;
1517
+ }
1518
+ }
1519
+ return null;
1520
+ } else {
1521
+ // 普通语法
1522
+ let $closest = $el?.closest<E>(selector);
1523
+ return $closest;
1524
+ }
1525
+ }
1397
1526
  }