@whitesev/domutils 1.3.4 → 1.3.6

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.umd.js CHANGED
@@ -599,11 +599,18 @@
599
599
  click(element, handler, details, useDispatchToTriggerEvent) {
600
600
  let DOMUtilsContext = this;
601
601
  if (typeof element === "string") {
602
- element = DOMUtilsContext.windowApi.document.querySelector(element);
602
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
603
603
  }
604
604
  if (element == null) {
605
605
  return;
606
606
  }
607
+ if (isNodeList(element)) {
608
+ // 设置
609
+ element.forEach(($ele) => {
610
+ DOMUtilsContext.click($ele, handler, details, useDispatchToTriggerEvent);
611
+ });
612
+ return;
613
+ }
607
614
  if (handler == null) {
608
615
  DOMUtilsContext.trigger(element, "click", details, useDispatchToTriggerEvent);
609
616
  }
@@ -633,6 +640,13 @@
633
640
  if (element == null) {
634
641
  return;
635
642
  }
643
+ if (isNodeList(element)) {
644
+ // 设置
645
+ element.forEach(($ele) => {
646
+ DOMUtilsContext.focus($ele, handler, details, useDispatchToTriggerEvent);
647
+ });
648
+ return;
649
+ }
636
650
  if (handler === null) {
637
651
  DOMUtilsContext.trigger(element, "blur", details, useDispatchToTriggerEvent);
638
652
  }
@@ -657,11 +671,18 @@
657
671
  focus(element, handler, details, useDispatchToTriggerEvent) {
658
672
  let DOMUtilsContext = this;
659
673
  if (typeof element === "string") {
660
- element = DOMUtilsContext.windowApi.document.querySelector(element);
674
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
661
675
  }
662
676
  if (element == null) {
663
677
  return;
664
678
  }
679
+ if (isNodeList(element)) {
680
+ // 设置
681
+ element.forEach(($ele) => {
682
+ DOMUtilsContext.focus($ele, handler, details, useDispatchToTriggerEvent);
683
+ });
684
+ return;
685
+ }
665
686
  if (handler == null) {
666
687
  DOMUtilsContext.trigger(element, "focus", details, useDispatchToTriggerEvent);
667
688
  }
@@ -686,18 +707,25 @@
686
707
  hover(element, handler, option) {
687
708
  let DOMUtilsContext = this;
688
709
  if (typeof element === "string") {
689
- element = DOMUtilsContext.windowApi.document.querySelector(element);
710
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
690
711
  }
691
712
  if (element == null) {
692
713
  return;
693
714
  }
715
+ if (isNodeList(element)) {
716
+ // 设置
717
+ element.forEach(($ele) => {
718
+ DOMUtilsContext.hover($ele, handler, option);
719
+ });
720
+ return;
721
+ }
694
722
  DOMUtilsContext.on(element, "mouseenter", null, handler, option);
695
723
  DOMUtilsContext.on(element, "mouseleave", null, handler, option);
696
724
  }
697
725
  /**
698
726
  * 当按键松开时触发事件
699
727
  * keydown - > keypress - > keyup
700
- * @param target 当前元素
728
+ * @param element 当前元素
701
729
  * @param handler 事件处理函数
702
730
  * @param option 配置
703
731
  * @example
@@ -709,20 +737,27 @@
709
737
  * console.log("按键松开");
710
738
  * })
711
739
  */
712
- keyup(target, handler, option) {
740
+ keyup(element, handler, option) {
713
741
  let DOMUtilsContext = this;
714
- if (target == null) {
742
+ if (element == null) {
715
743
  return;
716
744
  }
717
- if (typeof target === "string") {
718
- target = DOMUtilsContext.windowApi.document.querySelector(target);
745
+ if (typeof element === "string") {
746
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
719
747
  }
720
- DOMUtilsContext.on(target, "keyup", null, handler, option);
748
+ if (isNodeList(element)) {
749
+ // 设置
750
+ element.forEach(($ele) => {
751
+ DOMUtilsContext.keyup($ele, handler, option);
752
+ });
753
+ return;
754
+ }
755
+ DOMUtilsContext.on(element, "keyup", null, handler, option);
721
756
  }
722
757
  /**
723
758
  * 当按键按下时触发事件
724
759
  * keydown - > keypress - > keyup
725
- * @param target 目标
760
+ * @param element 目标
726
761
  * @param handler 事件处理函数
727
762
  * @param option 配置
728
763
  * @example
@@ -734,20 +769,27 @@
734
769
  * console.log("按键按下");
735
770
  * })
736
771
  */
737
- keydown(target, handler, option) {
772
+ keydown(element, handler, option) {
738
773
  let DOMUtilsContext = this;
739
- if (target == null) {
774
+ if (element == null) {
740
775
  return;
741
776
  }
742
- if (typeof target === "string") {
743
- target = DOMUtilsContext.windowApi.document.querySelector(target);
777
+ if (typeof element === "string") {
778
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
744
779
  }
745
- DOMUtilsContext.on(target, "keydown", null, handler, option);
780
+ if (isNodeList(element)) {
781
+ // 设置
782
+ element.forEach(($ele) => {
783
+ DOMUtilsContext.keydown($ele, handler, option);
784
+ });
785
+ return;
786
+ }
787
+ DOMUtilsContext.on(element, "keydown", null, handler, option);
746
788
  }
747
789
  /**
748
790
  * 当按键按下时触发事件
749
791
  * keydown - > keypress - > keyup
750
- * @param target 目标
792
+ * @param element 目标
751
793
  * @param handler 事件处理函数
752
794
  * @param option 配置
753
795
  * @example
@@ -759,20 +801,27 @@
759
801
  * console.log("按键按下");
760
802
  * })
761
803
  */
762
- keypress(target, handler, option) {
804
+ keypress(element, handler, option) {
763
805
  let DOMUtilsContext = this;
764
- if (target == null) {
806
+ if (element == null) {
765
807
  return;
766
808
  }
767
- if (typeof target === "string") {
768
- target = DOMUtilsContext.windowApi.document.querySelector(target);
809
+ if (typeof element === "string") {
810
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
811
+ }
812
+ if (isNodeList(element)) {
813
+ // 设置
814
+ element.forEach(($ele) => {
815
+ DOMUtilsContext.keypress($ele, handler, option);
816
+ });
817
+ return;
769
818
  }
770
- DOMUtilsContext.on(target, "keypress", null, handler, option);
819
+ DOMUtilsContext.on(element, "keypress", null, handler, option);
771
820
  }
772
821
  /**
773
822
  * 监听某个元素键盘按键事件或window全局按键事件
774
823
  * 按下有值的键时触发,按下Ctrl\Alt\Shift\Meta是无值键。按下先触发keydown事件,再触发keypress事件。
775
- * @param target 需要监听的对象,可以是全局Window或者某个元素
824
+ * @param element 需要监听的对象,可以是全局Window或者某个元素
776
825
  * @param eventName 事件名,默认keypress
777
826
  * @param callback 自己定义的回调事件,参数1为当前的key,参数2为组合按键,数组类型,包含ctrl、shift、alt和meta(win键或mac的cmd键)
778
827
  * @param options 监听事件的配置
@@ -832,7 +881,11 @@
832
881
  搜索 170
833
882
  收藏 171
834
883
  **/
835
- listenKeyboard(target, eventName = "keypress", callback, options) {
884
+ listenKeyboard(element, eventName = "keypress", callback, options) {
885
+ let DOMUtilsContext = this;
886
+ if (typeof element === "string") {
887
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
888
+ }
836
889
  let keyboardEventCallBack = function (event) {
837
890
  /** 键名 */
838
891
  let keyName = event.key || event.code;
@@ -856,29 +909,90 @@
856
909
  callback(keyName, keyValue, otherCodeList, event);
857
910
  }
858
911
  };
859
- this.on(target, eventName, keyboardEventCallBack, options);
912
+ DOMUtilsContext.on(element, eventName, keyboardEventCallBack, options);
860
913
  return {
861
914
  removeListen: () => {
862
- this.off(target, eventName, keyboardEventCallBack, options);
915
+ DOMUtilsContext.off(element, eventName, keyboardEventCallBack, options);
863
916
  },
864
917
  };
865
918
  }
919
+ selector(selector) {
920
+ return this.selectorAll(selector)[0];
921
+ }
922
+ selectorAll(selector) {
923
+ const context = this;
924
+ selector = selector.trim();
925
+ if (selector.match(/[^\s]{1}:empty$/gi)) {
926
+ // empty 语法
927
+ selector = selector.replace(/:empty$/gi, "");
928
+ return Array.from(context.windowApi.document.querySelectorAll(selector)).filter(($ele) => {
929
+ return $ele?.innerHTML?.trim() === "";
930
+ });
931
+ }
932
+ else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/gi) ||
933
+ selector.match(/[^\s]{1}:contains\('(.*)'\)$/gi)) {
934
+ // contains 语法
935
+ let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
936
+ let text = textMatch[2];
937
+ selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
938
+ return Array.from(context.windowApi.document.querySelectorAll(selector)).filter(($ele) => {
939
+ // @ts-ignore
940
+ return ($ele?.textContent || $ele?.innerText)?.includes(text);
941
+ });
942
+ }
943
+ else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/gi) ||
944
+ selector.match(/[^\s]{1}:regexp\('(.*)'\)$/gi)) {
945
+ // regexp 语法
946
+ let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
947
+ let text = textMatch[2];
948
+ let regexp = new RegExp(text);
949
+ selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
950
+ return Array.from(context.windowApi.document.querySelectorAll(selector)).filter(($ele) => {
951
+ // @ts-ignore
952
+ return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
953
+ });
954
+ }
955
+ else {
956
+ // 普通语法
957
+ return Array.from(context.windowApi.document.querySelectorAll(selector));
958
+ }
959
+ }
866
960
  }
867
961
 
962
+ /**
963
+ * 判断是否是元素列表
964
+ * @param $ele
965
+ */
966
+ const isNodeList = ($ele) => {
967
+ return Array.isArray($ele) || $ele instanceof NodeList;
968
+ };
868
969
  class DOMUtils extends DOMUtilsEvent {
869
970
  constructor(option) {
870
971
  super(option);
871
972
  }
872
973
  /** 版本号 */
873
- version = "2024.10.19";
974
+ version = "2024.10.22";
874
975
  attr(element, attrName, attrValue) {
875
976
  let DOMUtilsContext = this;
876
977
  if (typeof element === "string") {
877
- element = DOMUtilsContext.windowApi.document.querySelector(element);
978
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
878
979
  }
879
980
  if (element == null) {
880
981
  return;
881
982
  }
983
+ if (isNodeList(element)) {
984
+ if (attrValue == null) {
985
+ // 获取属性
986
+ return DOMUtilsContext.attr(element[0], attrName, attrValue);
987
+ }
988
+ else {
989
+ // 设置属性
990
+ element.forEach(($ele) => {
991
+ DOMUtilsContext.attr($ele, attrName, attrValue);
992
+ });
993
+ return;
994
+ }
995
+ }
882
996
  if (attrValue == null) {
883
997
  return element.getAttribute(attrName);
884
998
  }
@@ -967,14 +1081,40 @@
967
1081
  return propertyValue;
968
1082
  }
969
1083
  if (typeof element === "string") {
970
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1084
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
971
1085
  }
972
1086
  if (element == null) {
973
1087
  return;
974
1088
  }
1089
+ if (isNodeList(element)) {
1090
+ if (typeof property === "string") {
1091
+ if (value == null) {
1092
+ // 获取属性
1093
+ return DOMUtilsContext.css(element[0], property);
1094
+ }
1095
+ else {
1096
+ // 设置属性
1097
+ element.forEach(($ele) => {
1098
+ DOMUtilsContext.css($ele, property);
1099
+ });
1100
+ return;
1101
+ }
1102
+ }
1103
+ else if (typeof property === "object") {
1104
+ // 设置属性
1105
+ element.forEach(($ele) => {
1106
+ DOMUtilsContext.css($ele, property);
1107
+ });
1108
+ return;
1109
+ }
1110
+ else ;
1111
+ return;
1112
+ }
975
1113
  if (typeof property === "string") {
976
1114
  if (value == null) {
977
- return getComputedStyle(element).getPropertyValue(property);
1115
+ return DOMUtilsContext.windowApi.globalThis
1116
+ .getComputedStyle(element)
1117
+ .getPropertyValue(property);
978
1118
  }
979
1119
  else {
980
1120
  if (value === "string" && value.includes("!important")) {
@@ -998,15 +1138,29 @@
998
1138
  }
999
1139
  }
1000
1140
  }
1141
+ else ;
1001
1142
  }
1002
1143
  text(element, text) {
1003
1144
  let DOMUtilsContext = this;
1004
1145
  if (typeof element === "string") {
1005
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1146
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1006
1147
  }
1007
1148
  if (element == null) {
1008
1149
  return;
1009
1150
  }
1151
+ if (isNodeList(element)) {
1152
+ if (text == null) {
1153
+ // 获取
1154
+ return DOMUtilsContext.text(element[0]);
1155
+ }
1156
+ else {
1157
+ // 设置
1158
+ element.forEach(($ele) => {
1159
+ DOMUtilsContext.text($ele, text);
1160
+ });
1161
+ }
1162
+ return;
1163
+ }
1010
1164
  if (text == null) {
1011
1165
  return element.textContent || element.innerText;
1012
1166
  }
@@ -1025,15 +1179,30 @@
1025
1179
  html(element, html) {
1026
1180
  let DOMUtilsContext = this;
1027
1181
  if (typeof element === "string") {
1028
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1182
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1029
1183
  }
1030
1184
  if (element == null) {
1031
1185
  return;
1032
1186
  }
1187
+ if (isNodeList(element)) {
1188
+ if (html == null) {
1189
+ // 获取
1190
+ return DOMUtilsContext.html(element[0]);
1191
+ }
1192
+ else {
1193
+ // 设置
1194
+ element.forEach(($ele) => {
1195
+ DOMUtilsContext.html($ele, html);
1196
+ });
1197
+ }
1198
+ return;
1199
+ }
1033
1200
  if (html == null) {
1201
+ // 获取
1034
1202
  return element.innerHTML;
1035
1203
  }
1036
1204
  else {
1205
+ // 设置
1037
1206
  if (html instanceof Element) {
1038
1207
  html = html.innerHTML;
1039
1208
  }
@@ -1056,7 +1225,7 @@
1056
1225
  recovery();
1057
1226
  return transformInfo;
1058
1227
  }
1059
- let elementTransform = getComputedStyle(element).transform;
1228
+ let elementTransform = DOMUtilsContext.windowApi.globalThis.getComputedStyle(element).transform;
1060
1229
  if (elementTransform != null &&
1061
1230
  elementTransform !== "none" &&
1062
1231
  elementTransform !== "") {
@@ -1080,12 +1249,26 @@
1080
1249
  val(element, value) {
1081
1250
  let DOMUtilsContext = this;
1082
1251
  if (typeof element === "string") {
1083
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1252
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1084
1253
  }
1085
1254
  if (element == null) {
1086
1255
  return;
1087
1256
  }
1257
+ if (isNodeList(element)) {
1258
+ if (value == null) {
1259
+ // 获取
1260
+ return DOMUtilsContext.val(element[0]);
1261
+ }
1262
+ else {
1263
+ // 设置
1264
+ element.forEach(($ele) => {
1265
+ DOMUtilsContext.val($ele, value);
1266
+ });
1267
+ }
1268
+ return;
1269
+ }
1088
1270
  if (value == null) {
1271
+ // 获取
1089
1272
  if (element.localName === "input" &&
1090
1273
  (element.type === "checkbox" || element.type === "radio")) {
1091
1274
  return element.checked;
@@ -1095,6 +1278,7 @@
1095
1278
  }
1096
1279
  }
1097
1280
  else {
1281
+ // 设置
1098
1282
  if (element.localName === "input" &&
1099
1283
  (element.type === "checkbox" || element.type === "radio")) {
1100
1284
  element.checked = !!value;
@@ -1106,17 +1290,30 @@
1106
1290
  }
1107
1291
  prop(element, propName, propValue) {
1108
1292
  let DOMUtilsContext = this;
1293
+ if (typeof element === "string") {
1294
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1295
+ }
1109
1296
  if (element == null) {
1110
1297
  return;
1111
1298
  }
1112
- if (typeof element === "string") {
1113
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1299
+ if (isNodeList(element)) {
1300
+ if (propValue == null) {
1301
+ // 获取
1302
+ return DOMUtilsContext.prop(element[0], propName);
1303
+ }
1304
+ else {
1305
+ // 设置
1306
+ element.forEach(($ele) => {
1307
+ DOMUtilsContext.prop($ele, propName, propValue);
1308
+ });
1309
+ }
1310
+ return;
1114
1311
  }
1115
1312
  if (propValue == null) {
1116
- return element[propName];
1313
+ return Reflect.get(element, propName);
1117
1314
  }
1118
1315
  else {
1119
- element[propName] = propValue;
1316
+ Reflect.set(element, propName, propValue);
1120
1317
  }
1121
1318
  }
1122
1319
  /**
@@ -1131,11 +1328,18 @@
1131
1328
  removeAttr(element, attrName) {
1132
1329
  let DOMUtilsContext = this;
1133
1330
  if (typeof element === "string") {
1134
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1331
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1135
1332
  }
1136
1333
  if (element == null) {
1137
1334
  return;
1138
1335
  }
1336
+ if (isNodeList(element)) {
1337
+ // 设置
1338
+ element.forEach(($ele) => {
1339
+ DOMUtilsContext.removeAttr($ele, attrName);
1340
+ });
1341
+ return;
1342
+ }
1139
1343
  element.removeAttribute(attrName);
1140
1344
  }
1141
1345
  /**
@@ -1150,15 +1354,30 @@
1150
1354
  removeClass(element, className) {
1151
1355
  let DOMUtilsContext = this;
1152
1356
  if (typeof element === "string") {
1153
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1357
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1154
1358
  }
1155
1359
  if (element == null) {
1156
1360
  return;
1157
1361
  }
1158
- if (className == null) {
1362
+ if (isNodeList(element)) {
1363
+ // 设置
1364
+ element.forEach(($ele) => {
1365
+ DOMUtilsContext.removeClass($ele, className);
1366
+ });
1159
1367
  return;
1160
1368
  }
1161
- element.classList.remove(className);
1369
+ if (className == null) {
1370
+ // 清空全部className
1371
+ element.className = "";
1372
+ }
1373
+ else {
1374
+ if (!Array.isArray(className)) {
1375
+ className = className.split(" ");
1376
+ }
1377
+ className.forEach((itemClassName) => {
1378
+ element.classList.remove(itemClassName);
1379
+ });
1380
+ }
1162
1381
  }
1163
1382
  /**
1164
1383
  * 移除元素的属性
@@ -1172,11 +1391,18 @@
1172
1391
  removeProp(element, propName) {
1173
1392
  let DOMUtilsContext = this;
1174
1393
  if (typeof element === "string") {
1175
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1394
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1176
1395
  }
1177
1396
  if (element == null) {
1178
1397
  return;
1179
1398
  }
1399
+ if (isNodeList(element)) {
1400
+ // 设置
1401
+ element.forEach(($ele) => {
1402
+ DOMUtilsContext.removeProp($ele, propName);
1403
+ });
1404
+ return;
1405
+ }
1180
1406
  DOMUtilsCommonUtils.delete(element, propName);
1181
1407
  }
1182
1408
  /**
@@ -1191,22 +1417,22 @@
1191
1417
  replaceWith(element, newElement) {
1192
1418
  let DOMUtilsContext = this;
1193
1419
  if (typeof element === "string") {
1194
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1420
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1195
1421
  }
1196
1422
  if (element == null) {
1197
1423
  return;
1198
1424
  }
1199
- if (typeof newElement === "string") {
1200
- newElement = DOMUtilsContext.parseHTML(newElement, false, false);
1201
- }
1202
- if (element instanceof NodeList || element instanceof Array) {
1203
- element.forEach((item) => {
1204
- DOMUtilsContext.replaceWith(item, newElement);
1425
+ if (isNodeList(element)) {
1426
+ // 设置
1427
+ element.forEach(($ele) => {
1428
+ DOMUtilsContext.replaceWith($ele, newElement);
1205
1429
  });
1430
+ return;
1206
1431
  }
1207
- else {
1208
- element.parentElement.replaceChild(newElement, element);
1432
+ if (typeof newElement === "string") {
1433
+ newElement = DOMUtilsContext.parseHTML(newElement, false, false);
1209
1434
  }
1435
+ element.parentElement.replaceChild(newElement, element);
1210
1436
  }
1211
1437
  /**
1212
1438
  * 给元素添加class
@@ -1220,12 +1446,27 @@
1220
1446
  addClass(element, className) {
1221
1447
  let DOMUtilsContext = this;
1222
1448
  if (typeof element === "string") {
1223
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1449
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1224
1450
  }
1225
1451
  if (element == null) {
1226
1452
  return;
1227
1453
  }
1228
- element.classList.add(className);
1454
+ if (isNodeList(element)) {
1455
+ // 设置
1456
+ element.forEach(($ele) => {
1457
+ DOMUtilsContext.addClass($ele, className);
1458
+ });
1459
+ return;
1460
+ }
1461
+ if (!Array.isArray(className)) {
1462
+ className = className.split(" ");
1463
+ }
1464
+ className.forEach((itemClassName) => {
1465
+ if (itemClassName.trim() == "") {
1466
+ return;
1467
+ }
1468
+ element.classList.add(itemClassName);
1469
+ });
1229
1470
  }
1230
1471
  /**
1231
1472
  * 函数在元素内部末尾添加子元素或HTML字符串
@@ -1239,11 +1480,18 @@
1239
1480
  append(element, content) {
1240
1481
  let DOMUtilsContext = this;
1241
1482
  if (typeof element === "string") {
1242
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1483
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1243
1484
  }
1244
1485
  if (element == null) {
1245
1486
  return;
1246
1487
  }
1488
+ if (isNodeList(element)) {
1489
+ // 设置
1490
+ element.forEach(($ele) => {
1491
+ DOMUtilsContext.append($ele, content);
1492
+ });
1493
+ return;
1494
+ }
1247
1495
  function elementAppendChild(ele, text) {
1248
1496
  if (typeof content === "string") {
1249
1497
  ele.insertAdjacentHTML("beforeend", text);
@@ -1257,7 +1505,7 @@
1257
1505
  let fragment = DOMUtilsContext.windowApi.document.createDocumentFragment();
1258
1506
  content.forEach((ele) => {
1259
1507
  if (typeof ele === "string") {
1260
- ele = this.parseHTML(ele, true, false);
1508
+ ele = DOMUtilsContext.parseHTML(ele, true, false);
1261
1509
  }
1262
1510
  fragment.appendChild(ele);
1263
1511
  });
@@ -1279,11 +1527,18 @@
1279
1527
  prepend(element, content) {
1280
1528
  let DOMUtilsContext = this;
1281
1529
  if (typeof element === "string") {
1282
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1530
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1283
1531
  }
1284
1532
  if (element == null) {
1285
1533
  return;
1286
1534
  }
1535
+ if (isNodeList(element)) {
1536
+ // 设置
1537
+ element.forEach(($ele) => {
1538
+ DOMUtilsContext.prepend($ele, content);
1539
+ });
1540
+ return;
1541
+ }
1287
1542
  if (typeof content === "string") {
1288
1543
  element.insertAdjacentHTML("afterbegin", content);
1289
1544
  }
@@ -1309,11 +1564,18 @@
1309
1564
  after(element, content) {
1310
1565
  let DOMUtilsContext = this;
1311
1566
  if (typeof element === "string") {
1312
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1567
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1313
1568
  }
1314
1569
  if (element == null) {
1315
1570
  return;
1316
1571
  }
1572
+ if (isNodeList(element)) {
1573
+ // 设置
1574
+ element.forEach(($ele) => {
1575
+ DOMUtilsContext.after($ele, content);
1576
+ });
1577
+ return;
1578
+ }
1317
1579
  if (typeof content === "string") {
1318
1580
  element.insertAdjacentHTML("afterend", content);
1319
1581
  }
@@ -1341,11 +1603,18 @@
1341
1603
  before(element, content) {
1342
1604
  let DOMUtilsContext = this;
1343
1605
  if (typeof element === "string") {
1344
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1606
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1345
1607
  }
1346
1608
  if (element == null) {
1347
1609
  return;
1348
1610
  }
1611
+ if (isNodeList(element)) {
1612
+ // 设置
1613
+ element.forEach(($ele) => {
1614
+ DOMUtilsContext.before($ele, content);
1615
+ });
1616
+ return;
1617
+ }
1349
1618
  if (typeof content === "string") {
1350
1619
  element.insertAdjacentHTML("beforebegin", content);
1351
1620
  }
@@ -1361,30 +1630,28 @@
1361
1630
  }
1362
1631
  /**
1363
1632
  * 移除元素
1364
- * @param target 目标元素
1633
+ * @param element 目标元素
1365
1634
  * @example
1366
1635
  * // 元素a.xx前面添加一个元素
1367
1636
  * DOMUtils.remove(document.querySelector("a.xx"))
1368
1637
  * DOMUtils.remove(document.querySelectorAll("a.xx"))
1369
1638
  * DOMUtils.remove("a.xx")
1370
1639
  * */
1371
- remove(target) {
1640
+ remove(element) {
1372
1641
  let DOMUtilsContext = this;
1373
- if (typeof target === "string") {
1374
- target = DOMUtilsContext.windowApi.document.querySelectorAll(target);
1642
+ if (typeof element === "string") {
1643
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1375
1644
  }
1376
- if (target == null) {
1645
+ if (element == null) {
1377
1646
  return;
1378
1647
  }
1379
- if (target instanceof NodeList || target instanceof Array) {
1380
- target = target;
1381
- for (const element of target) {
1382
- DOMUtilsContext.remove(element);
1383
- }
1384
- }
1385
- else {
1386
- target.remove();
1648
+ if (isNodeList(element)) {
1649
+ element.forEach(($ele) => {
1650
+ DOMUtilsContext.remove($ele);
1651
+ });
1652
+ return;
1387
1653
  }
1654
+ element.remove();
1388
1655
  }
1389
1656
  /**
1390
1657
  * 移除元素的所有子元素
@@ -1397,11 +1664,18 @@
1397
1664
  empty(element) {
1398
1665
  let DOMUtilsContext = this;
1399
1666
  if (typeof element === "string") {
1400
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1667
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1401
1668
  }
1402
1669
  if (element == null) {
1403
1670
  return;
1404
1671
  }
1672
+ if (isNodeList(element)) {
1673
+ // 设置
1674
+ element.forEach(($ele) => {
1675
+ DOMUtilsContext.empty($ele);
1676
+ });
1677
+ return;
1678
+ }
1405
1679
  element.innerHTML = "";
1406
1680
  }
1407
1681
  /**
@@ -1432,7 +1706,8 @@
1432
1706
  width(element, isShow = false) {
1433
1707
  let DOMUtilsContext = this;
1434
1708
  if (typeof element === "string") {
1435
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1709
+ element =
1710
+ DOMUtilsContext.windowApi.document.querySelector(element);
1436
1711
  }
1437
1712
  if (element == null) {
1438
1713
  return;
@@ -1544,7 +1819,7 @@
1544
1819
  }
1545
1820
  element = element;
1546
1821
  if (isShow || (!isShow && DOMUtilsCommonUtils.isShow(element))) {
1547
- let style = getComputedStyle(element, null);
1822
+ let style = DOMUtilsContext.windowApi.globalThis.getComputedStyle(element, null);
1548
1823
  let marginLeft = DOMUtilsCommonUtils.getStyleValue(style, "marginLeft");
1549
1824
  let marginRight = DOMUtilsCommonUtils.getStyleValue(style, "marginRight");
1550
1825
  return element.offsetWidth + marginLeft + marginRight;
@@ -1570,7 +1845,7 @@
1570
1845
  }
1571
1846
  element = element;
1572
1847
  if (isShow || (!isShow && DOMUtilsCommonUtils.isShow(element))) {
1573
- let style = getComputedStyle(element, null);
1848
+ let style = DOMUtilsContext.windowApi.globalThis.getComputedStyle(element, null);
1574
1849
  let marginTop = DOMUtilsCommonUtils.getStyleValue(style, "marginTop");
1575
1850
  let marginBottom = DOMUtilsCommonUtils.getStyleValue(style, "marginBottom");
1576
1851
  return element.offsetHeight + marginTop + marginBottom;
@@ -1597,11 +1872,18 @@
1597
1872
  animate(element, styles, duration = 1000, callback = null) {
1598
1873
  let DOMUtilsContext = this;
1599
1874
  if (typeof element === "string") {
1600
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1875
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1601
1876
  }
1602
1877
  if (element == null) {
1603
1878
  return;
1604
1879
  }
1880
+ if (isNodeList(element)) {
1881
+ // 设置
1882
+ element.forEach(($ele) => {
1883
+ DOMUtilsContext.animate($ele, styles, duration, callback);
1884
+ });
1885
+ return;
1886
+ }
1605
1887
  if (typeof duration !== "number" || duration <= 0) {
1606
1888
  throw new TypeError("duration must be a positive number");
1607
1889
  }
@@ -1618,7 +1900,9 @@
1618
1900
  let from = {};
1619
1901
  let to = {};
1620
1902
  for (let prop in styles) {
1621
- from[prop] = element.style[prop] || getComputedStyle(element)[prop];
1903
+ from[prop] =
1904
+ element.style[prop] ||
1905
+ DOMUtilsContext.windowApi.globalThis.getComputedStyle(element)[prop];
1622
1906
  to[prop] = styles[prop];
1623
1907
  }
1624
1908
  let timer = setInterval(function () {
@@ -1650,18 +1934,26 @@
1650
1934
  wrap(element, wrapperHTML) {
1651
1935
  let DOMUtilsContext = this;
1652
1936
  if (typeof element === "string") {
1653
- element = DOMUtilsContext.windowApi.document.querySelector(element);
1937
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1654
1938
  }
1655
1939
  if (element == null) {
1656
1940
  return;
1657
1941
  }
1942
+ if (isNodeList(element)) {
1943
+ // 设置
1944
+ element.forEach(($ele) => {
1945
+ DOMUtilsContext.wrap($ele, wrapperHTML);
1946
+ });
1947
+ return;
1948
+ }
1658
1949
  element = element;
1659
1950
  // 创建一个新的div元素,并将wrapperHTML作为其innerHTML
1660
1951
  let wrapper = DOMUtilsContext.windowApi.document.createElement("div");
1661
1952
  wrapper.innerHTML = wrapperHTML;
1662
1953
  let wrapperFirstChild = wrapper.firstChild;
1663
1954
  // 将要包裹的元素插入目标元素前面
1664
- element.parentElement.insertBefore(wrapperFirstChild, element);
1955
+ let parentElement = element.parentElement;
1956
+ parentElement.insertBefore(wrapperFirstChild, element);
1665
1957
  // 将要包裹的元素移动到wrapper中
1666
1958
  wrapperFirstChild.appendChild(element);
1667
1959
  }
@@ -1741,6 +2033,8 @@
1741
2033
  }
1742
2034
  parseHTML(html, useParser = false, isComplete = false) {
1743
2035
  let DOMUtilsContext = this;
2036
+ // 去除html前后的空格
2037
+ html = html.trim();
1744
2038
  function parseHTMLByDOMParser() {
1745
2039
  let parser = new DOMParser();
1746
2040
  if (isComplete) {
@@ -1767,16 +2061,61 @@
1767
2061
  return parseHTMLByCreateDom();
1768
2062
  }
1769
2063
  }
2064
+ /**
2065
+ * 序列化表单元素
2066
+ * @param $form 表单元素
2067
+ * @example
2068
+ * DOMUtils.serialize(document.querySelector("form"))
2069
+ * > xxx=xxx&aaa=
2070
+ */
2071
+ serialize($form) {
2072
+ const elements = $form.elements;
2073
+ let serializedArray = [];
2074
+ for (let i = 0; i < elements.length; i++) {
2075
+ const element = elements[i];
2076
+ if (element.name &&
2077
+ !element.disabled &&
2078
+ (element.checked ||
2079
+ [
2080
+ "text",
2081
+ "hidden",
2082
+ "password",
2083
+ "textarea",
2084
+ "select-one",
2085
+ "select-multiple",
2086
+ ].includes(element.type))) {
2087
+ if (element.type === "select-multiple") {
2088
+ for (let j = 0; j < element.options.length; j++) {
2089
+ if (element.options[j].selected) {
2090
+ serializedArray.push({
2091
+ name: element.name,
2092
+ value: element.options[j].value,
2093
+ });
2094
+ }
2095
+ }
2096
+ }
2097
+ else {
2098
+ serializedArray.push({ name: element.name, value: element.value });
2099
+ }
2100
+ }
2101
+ }
2102
+ return serializedArray
2103
+ .map((item) => `${encodeURIComponent(item.name)}=${encodeURIComponent(item.value)}`)
2104
+ .join("&");
2105
+ }
1770
2106
  /**
1771
2107
  * 显示元素
1772
2108
  * @param target 当前元素
2109
+ * @param checkVisiblie 是否检测元素是否显示
2110
+ * + true (默认)如果检测到还未显示,则强制使用display: unset !important;
2111
+ * + false 不检测,直接设置display属性为空
1773
2112
  * @example
1774
2113
  * // 显示a.xx元素
1775
2114
  * DOMUtils.show(document.querySelector("a.xx"))
1776
2115
  * DOMUtils.show(document.querySelectorAll("a.xx"))
1777
2116
  * DOMUtils.show("a.xx")
1778
2117
  */
1779
- show(target) {
2118
+ show(target, checkVisiblie = true) {
1780
2119
  let DOMUtilsContext = this;
1781
2120
  if (target == null) {
1782
2121
  return;
@@ -1787,28 +2126,33 @@
1787
2126
  if (target instanceof NodeList || target instanceof Array) {
1788
2127
  target = target;
1789
2128
  for (const element of target) {
1790
- DOMUtilsContext.show(element);
2129
+ DOMUtilsContext.show(element, checkVisiblie);
1791
2130
  }
1792
2131
  }
1793
2132
  else {
1794
2133
  target = target;
1795
2134
  target.style.display = "";
1796
- if (!DOMUtilsCommonUtils.isShow(target)) {
1797
- /* 仍然是不显示,尝试使用强覆盖 */
1798
- target.style.setProperty("display", "unset", "important");
2135
+ if (checkVisiblie) {
2136
+ if (!DOMUtilsCommonUtils.isShow(target)) {
2137
+ /* 仍然是不显示,尝试使用强覆盖 */
2138
+ target.style.setProperty("display", "unset", "important");
2139
+ }
1799
2140
  }
1800
2141
  }
1801
2142
  }
1802
2143
  /**
1803
2144
  * 隐藏元素
1804
2145
  * @param target 当前元素
2146
+ * @param checkVisiblie 是否检测元素是否显示
2147
+ * + true (默认)如果检测到显示,则强制使用display: none !important;
2148
+ * + false 不检测,直接设置display属性为none
1805
2149
  * @example
1806
2150
  * // 隐藏a.xx元素
1807
2151
  * DOMUtils.hide(document.querySelector("a.xx"))
1808
2152
  * DOMUtils.hide(document.querySelectorAll("a.xx"))
1809
2153
  * DOMUtils.hide("a.xx")
1810
2154
  */
1811
- hide(target) {
2155
+ hide(target, checkVisiblie = true) {
1812
2156
  let DOMUtilsContext = this;
1813
2157
  if (target == null) {
1814
2158
  return;
@@ -1819,15 +2163,17 @@
1819
2163
  if (target instanceof NodeList || target instanceof Array) {
1820
2164
  target = target;
1821
2165
  for (const element of target) {
1822
- DOMUtilsContext.hide(element);
2166
+ DOMUtilsContext.hide(element, checkVisiblie);
1823
2167
  }
1824
2168
  }
1825
2169
  else {
1826
2170
  target = target;
1827
2171
  target.style.display = "none";
1828
- if (DOMUtilsCommonUtils.isShow(target)) {
1829
- /* 仍然是显示,尝试使用强覆盖 */
1830
- target.style.setProperty("display", "none", "important");
2172
+ if (checkVisiblie) {
2173
+ if (DOMUtilsCommonUtils.isShow(target)) {
2174
+ /* 仍然是显示,尝试使用强覆盖 */
2175
+ target.style.setProperty("display", "none", "important");
2176
+ }
1831
2177
  }
1832
2178
  }
1833
2179
  }
@@ -1851,9 +2197,15 @@
1851
2197
  }
1852
2198
  let DOMUtilsContext = this;
1853
2199
  if (typeof element === "string") {
1854
- element = DOMUtilsContext.windowApi.document.querySelector(element);
2200
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
2201
+ }
2202
+ if (isNodeList(element)) {
2203
+ // 设置
2204
+ element.forEach(($ele) => {
2205
+ DOMUtilsContext.fadeIn($ele, duration, callback);
2206
+ });
2207
+ return;
1855
2208
  }
1856
- element = element;
1857
2209
  element.style.opacity = "0";
1858
2210
  element.style.display = "";
1859
2211
  let start = null;
@@ -1896,9 +2248,15 @@
1896
2248
  return;
1897
2249
  }
1898
2250
  if (typeof element === "string") {
1899
- element = DOMUtilsContext.windowApi.document.querySelector(element);
2251
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
2252
+ }
2253
+ if (isNodeList(element)) {
2254
+ // 设置
2255
+ element.forEach(($ele) => {
2256
+ DOMUtilsContext.fadeOut($ele, duration, callback);
2257
+ });
2258
+ return;
1900
2259
  }
1901
- element = element;
1902
2260
  element.style.opacity = "1";
1903
2261
  let start = null;
1904
2262
  let timer = null;
@@ -1924,24 +2282,34 @@
1924
2282
  /**
1925
2283
  * 切换元素的显示和隐藏状态
1926
2284
  * @param element 当前元素
2285
+ * @param checkVisiblie 是否检测元素是否显示
1927
2286
  * @example
1928
2287
  * // 如果元素a.xx当前是隐藏,则显示,如果是显示,则隐藏
1929
2288
  * DOMUtils.toggle(document.querySelector("a.xx"))
1930
2289
  * DOMUtils.toggle("a.xx")
1931
2290
  */
1932
- toggle(element) {
2291
+ toggle(element, checkVisiblie) {
1933
2292
  let DOMUtilsContext = this;
1934
2293
  if (typeof element === "string") {
1935
- element = DOMUtilsContext.windowApi.document.querySelector(element);
2294
+ element = DOMUtilsContext.windowApi.document.querySelectorAll(element);
1936
2295
  }
1937
2296
  if (element == null) {
1938
2297
  return;
1939
2298
  }
1940
- if (getComputedStyle(element).getPropertyValue("display") === "none") {
1941
- DOMUtilsContext.show(element);
2299
+ if (isNodeList(element)) {
2300
+ // 设置
2301
+ element.forEach(($ele) => {
2302
+ DOMUtilsContext.toggle($ele);
2303
+ });
2304
+ return;
2305
+ }
2306
+ if (DOMUtilsContext.windowApi.globalThis
2307
+ .getComputedStyle(element)
2308
+ .getPropertyValue("display") === "none") {
2309
+ DOMUtilsContext.show(element, checkVisiblie);
1942
2310
  }
1943
2311
  else {
1944
- DOMUtilsContext.hide(element);
2312
+ DOMUtilsContext.hide(element, checkVisiblie);
1945
2313
  }
1946
2314
  }
1947
2315
  /**