@whitesev/pops 3.3.2 → 3.3.4

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.
@@ -793,7 +793,7 @@ class PopsDOMUtilsEvent {
793
793
  useDispatchToEmitEvent: boolean = true
794
794
  ) {
795
795
  if (typeof element === "string") {
796
- element = PopsCore.document.querySelector(element) as HTMLElement;
796
+ element = this.selector(element) as HTMLElement;
797
797
  }
798
798
  if (element == null) {
799
799
  return;
@@ -858,17 +858,17 @@ class PopsDOMUtilsEvent {
858
858
  details?: any,
859
859
  useDispatchToEmitEvent?: boolean
860
860
  ) {
861
- const DOMUtilsContext = this;
862
861
  if (typeof element === "string") {
863
- element = PopsCore.document.querySelector(element) as HTMLElement;
862
+ element = this.selector(element) as HTMLElement;
864
863
  }
865
864
  if (element == null) {
866
865
  return;
867
866
  }
868
867
  if (handler == null) {
869
- DOMUtilsContext.emit(element, "click", details, useDispatchToEmitEvent);
868
+ this.emit(element, "click", details, useDispatchToEmitEvent);
870
869
  } else {
871
- DOMUtilsContext.on(element, "click", null, handler);
870
+ const listener = this.on(element, "click", handler);
871
+ return listener;
872
872
  }
873
873
  }
874
874
  /**
@@ -891,17 +891,17 @@ class PopsDOMUtilsEvent {
891
891
  details?: object,
892
892
  useDispatchToEmitEvent?: boolean
893
893
  ) {
894
- const DOMUtilsContext = this;
895
894
  if (typeof element === "string") {
896
- element = PopsCore.document.querySelector(element) as HTMLElement;
895
+ element = this.selector(element) as HTMLElement;
897
896
  }
898
897
  if (element == null) {
899
898
  return;
900
899
  }
901
900
  if (handler === null) {
902
- DOMUtilsContext.emit(element, "blur", details, useDispatchToEmitEvent);
901
+ this.emit(element, "blur", details, useDispatchToEmitEvent);
903
902
  } else {
904
- DOMUtilsContext.on(element, "blur", null, handler as (event: Event) => void);
903
+ const listener = this.on(element, "blur", handler as (event: Event) => void);
904
+ return listener;
905
905
  }
906
906
  }
907
907
  /**
@@ -924,17 +924,17 @@ class PopsDOMUtilsEvent {
924
924
  details?: object,
925
925
  useDispatchToEmitEvent?: boolean
926
926
  ) {
927
- const DOMUtilsContext = this;
928
927
  if (typeof element === "string") {
929
- element = PopsCore.document.querySelector(element) as HTMLElement;
928
+ element = this.selector(element) as HTMLElement;
930
929
  }
931
930
  if (element == null) {
932
931
  return;
933
932
  }
934
933
  if (handler == null) {
935
- DOMUtilsContext.emit(element, "focus", details, useDispatchToEmitEvent);
934
+ this.emit(element, "focus", details, useDispatchToEmitEvent);
936
935
  } else {
937
- DOMUtilsContext.on(element, "focus", null, handler);
936
+ const listener = this.on(element, "focus", handler);
937
+ return listener;
938
938
  }
939
939
  }
940
940
  /**
@@ -952,19 +952,44 @@ class PopsDOMUtilsEvent {
952
952
  * })
953
953
  */
954
954
  onHover(
955
- element: HTMLElement | string,
956
- handler: (event: PopsDOMUtils_Event["hover"]) => void,
957
- option?: boolean | AddEventListenerOptions
955
+ element: PopsDOMUtilsTargetElementType | Element | DocumentFragment | Node,
956
+ handler: (this: HTMLElement, event: PopsDOMUtils_Event["hover"]) => void,
957
+ option?: boolean | PopsDOMUtilsEventListenerOption
958
958
  ) {
959
- const DOMUtilsContext = this;
959
+ const that = this;
960
960
  if (typeof element === "string") {
961
- element = PopsCore.document.querySelector(element) as HTMLElement;
961
+ element = that.selectorAll(element);
962
962
  }
963
963
  if (element == null) {
964
964
  return;
965
965
  }
966
- DOMUtilsContext.on(element, "mouseenter", null, handler, option);
967
- DOMUtilsContext.on(element, "mouseleave", null, handler, option);
966
+ if (popsUtils.isNodeList(element)) {
967
+ // 设置
968
+ const listenerList: (PopsDOMUtilsAddEventListenerResult | undefined)[] = [];
969
+ element.forEach(($ele) => {
970
+ const listener = that.onHover($ele as HTMLElement, handler, option);
971
+ listenerList.push(listener);
972
+ });
973
+ return {
974
+ off() {
975
+ listenerList.forEach((listener) => {
976
+ if (!listener) {
977
+ return;
978
+ }
979
+ listener.off();
980
+ });
981
+ },
982
+ } as PopsDOMUtilsAddEventListenerResult;
983
+ }
984
+ const mouseenter_listener = that.on(element, "mouseenter", null, handler, option);
985
+ const mouseleave_listener = that.on(element, "mouseleave", null, handler, option);
986
+
987
+ return {
988
+ off() {
989
+ mouseenter_listener.off();
990
+ mouseleave_listener.off();
991
+ },
992
+ } as PopsDOMUtilsAddEventListenerResult;
968
993
  }
969
994
  /**
970
995
  * 当按键松开时触发事件
@@ -986,14 +1011,14 @@ class PopsDOMUtilsEvent {
986
1011
  handler: (event: PopsDOMUtils_Event["keyup"]) => void,
987
1012
  option?: boolean | AddEventListenerOptions
988
1013
  ) {
989
- const DOMUtilsContext = this;
990
1014
  if (target == null) {
991
1015
  return;
992
1016
  }
993
1017
  if (typeof target === "string") {
994
- target = PopsCore.document.querySelector(target) as HTMLElement;
1018
+ target = this.selector(target) as HTMLElement;
995
1019
  }
996
- DOMUtilsContext.on(target, "keyup", null, handler, option);
1020
+ const listener = this.on(target, "keyup", handler, option);
1021
+ return listener;
997
1022
  }
998
1023
  /**
999
1024
  * 当按键按下时触发事件
@@ -1015,14 +1040,14 @@ class PopsDOMUtilsEvent {
1015
1040
  handler: (event: PopsDOMUtils_Event["keydown"]) => void,
1016
1041
  option?: boolean | AddEventListenerOptions
1017
1042
  ) {
1018
- const DOMUtilsContext = this;
1019
1043
  if (target == null) {
1020
1044
  return;
1021
1045
  }
1022
1046
  if (typeof target === "string") {
1023
- target = PopsCore.document.querySelector(target) as HTMLElement;
1047
+ target = this.selector(target) as HTMLElement;
1024
1048
  }
1025
- DOMUtilsContext.on(target, "keydown", null, handler, option);
1049
+ const listener = this.on(target, "keydown", handler, option);
1050
+ return listener;
1026
1051
  }
1027
1052
  /**
1028
1053
  * 当按键按下时触发事件
@@ -1044,64 +1069,161 @@ class PopsDOMUtilsEvent {
1044
1069
  handler: (event: PopsDOMUtils_Event["keypress"]) => void,
1045
1070
  option?: boolean | AddEventListenerOptions
1046
1071
  ) {
1047
- const DOMUtilsContext = this;
1048
1072
  if (target == null) {
1049
1073
  return;
1050
1074
  }
1051
1075
  if (typeof target === "string") {
1052
- target = PopsCore.document.querySelector(target) as HTMLElement;
1076
+ target = this.selector(target) as HTMLElement;
1053
1077
  }
1054
- DOMUtilsContext.on(target, "keypress", null, handler, option);
1078
+ const listener = this.on(target, "keypress", handler, option);
1079
+ return listener;
1055
1080
  }
1056
1081
 
1057
1082
  /**
1058
1083
  * 阻止事件传递
1059
- * @param element 要进行处理的元素
1060
- * @param eventNameList (可选)要阻止的事件名|列表
1061
- * @param capture (可选)是否捕获,默认false
1062
- * @example
1063
- * Utils.preventEvent(document.querySelector("a"),"click")
1084
+ *
1085
+ * + `.preventDefault()`: 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
1086
+ * + `.stopPropagation()`: 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1087
+ * + `.stopImmediatePropagation()`: 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1088
+ * @param event 要阻止传递的事件
1064
1089
  * @example
1065
- * Utils.preventEvent(event);
1090
+ * DOMUtils.preventEvent(event);
1066
1091
  */
1067
- preventEvent(event: Event): boolean;
1092
+ preventEvent(event: Event): false;
1068
1093
  /**
1069
1094
  * 阻止事件传递
1070
- * @param element 要进行处理的元素
1071
- * @param eventNameList (可选)要阻止的事件名|列表
1072
- * @param capture (可选)是否捕获,默认false
1095
+ * @param event 要阻止传递的事件
1096
+ * @param onlyStopPropagation (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()`
1097
+ * @example
1098
+ * DOMUtils.preventEvent(event, true);
1099
+ */
1100
+ preventEvent<T extends boolean>(event: Event, onlyStopPropagation: T): T extends true ? void : false;
1101
+ /**
1102
+ * 通过监听事件来主动阻止事件的传递
1103
+ * @param $el 要进行处理的元素
1104
+ * @param eventNameList 要阻止的事件名|列表
1105
+ * @param option (可选)配置项
1106
+ * @example
1107
+ * DOMUtils.preventEvent(document.querySelector("a"), "click")
1108
+ * @example
1109
+ * DOMUtils.preventEvent(document.querySelector("a"), "click", undefined, {
1110
+ * capture: true,
1111
+ * })
1112
+ * @example
1113
+ * DOMUtils.preventEvent(document, "click", "a.xxx", {
1114
+ * capture: true,
1115
+ * onlyStopPropagation: true,
1116
+ * })
1117
+ */
1118
+ preventEvent(
1119
+ $el: HTMLElement,
1120
+ eventNameList: string | string[],
1121
+ option?: {
1122
+ /** (可选)是否捕获,默认false */
1123
+ capture?: boolean;
1124
+ /** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
1125
+ onlyStopPropagation?: boolean;
1126
+ }
1127
+ ): {
1128
+ /** 移除监听事件 */
1129
+ off(): void;
1130
+ };
1131
+ /**
1132
+ * 通过监听事件来主动阻止事件的传递
1133
+ * @param $el 要进行处理的元素
1134
+ * @param eventNameList 要阻止的事件名|列表
1135
+ * @param selector 子元素选择器
1136
+ * @param option (可选)配置项
1073
1137
  * @example
1074
- * Utils.preventEvent(document.querySelector("a"),"click")
1138
+ * DOMUtils.preventEvent(document.querySelector("a"), "click")
1075
1139
  * @example
1076
- * Utils.preventEvent(event);
1140
+ * DOMUtils.preventEvent(document.querySelector("a"), "click", undefined, {
1141
+ * capture: true,
1142
+ * })
1143
+ * @example
1144
+ * DOMUtils.preventEvent(document, "click", "a.xxx", {
1145
+ * capture: true,
1146
+ * onlyStopPropagation: true,
1147
+ * })
1077
1148
  */
1078
- preventEvent(element: HTMLElement, eventNameList?: string | string[], capture?: boolean): boolean;
1079
1149
  preventEvent(
1080
- element: HTMLElement | Event,
1081
- eventNameList: string | string[] = [],
1082
- capture?: boolean
1083
- ): boolean | undefined {
1084
- function stopEvent(event: Event) {
1085
- // 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL
1150
+ $el: HTMLElement,
1151
+ eventNameList: string | string[],
1152
+ selector: string | string[] | null | undefined,
1153
+ option?: {
1154
+ /** (可选)是否捕获,默认false */
1155
+ capture?: boolean;
1156
+ /** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
1157
+ onlyStopPropagation?: boolean;
1158
+ }
1159
+ ): {
1160
+ /** 移除监听事件 */
1161
+ off(): void;
1162
+ };
1163
+ preventEvent(...args: any[]): boolean | void | { off(): void } {
1164
+ /**
1165
+ * 阻止事件的默认行为发生,并阻止事件传播
1166
+ */
1167
+ const stopEvent = (event: Event, onlyStopPropagation?: boolean) => {
1168
+ if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
1169
+ // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1170
+ event?.stopPropagation();
1171
+ // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1172
+ event?.stopImmediatePropagation();
1173
+ return;
1174
+ }
1175
+ // 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
1086
1176
  event?.preventDefault();
1087
- // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1088
- event?.stopPropagation();
1089
- // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1090
- event?.stopImmediatePropagation();
1091
1177
  return false;
1092
- }
1093
- if (arguments.length === 1) {
1178
+ };
1179
+ if (args[0] instanceof Event) {
1094
1180
  // 直接阻止事件
1095
- // eslint-disable-next-line prefer-rest-params
1096
- return stopEvent(arguments[0]);
1181
+ const onlyStopPropagation: boolean = args[1];
1182
+ return stopEvent(args[0], onlyStopPropagation);
1097
1183
  } else {
1184
+ const $el: HTMLElement = args[0];
1185
+ let eventNameList: string | string[] = args[1];
1186
+ let selector: string | string[] | null | undefined = void 0;
1187
+ let capture = false;
1188
+ let onlyStopPropagation = false;
1098
1189
  // 添加对应的事件来阻止触发
1099
1190
  if (typeof eventNameList === "string") {
1100
1191
  eventNameList = [eventNameList];
1101
1192
  }
1102
- eventNameList.forEach((eventName) => {
1103
- this.on(element as HTMLElement, eventName, stopEvent, { capture: Boolean(capture) });
1104
- });
1193
+
1194
+ let option:
1195
+ | {
1196
+ capture?: boolean;
1197
+ onlyStopPropagation?: boolean;
1198
+ }
1199
+ | undefined = void 0;
1200
+ if (typeof args[2] === "string" || Array.isArray(args[2])) {
1201
+ // selector
1202
+ selector = args[2];
1203
+ if (typeof args[3] === "object" && args[3] != null) {
1204
+ option = args[3];
1205
+ }
1206
+ } else if (typeof args[2] === "object" && args[2] != null && !Array.isArray(args[2])) {
1207
+ // option
1208
+ option = args[2];
1209
+ } else {
1210
+ throw new TypeError("Invalid argument");
1211
+ }
1212
+ if (option) {
1213
+ capture = Boolean(option.capture);
1214
+ onlyStopPropagation = Boolean(option.onlyStopPropagation);
1215
+ }
1216
+
1217
+ const listener = this.on(
1218
+ $el,
1219
+ eventNameList,
1220
+ selector,
1221
+ (evt) => {
1222
+ return stopEvent(evt, onlyStopPropagation);
1223
+ },
1224
+ { capture: capture }
1225
+ );
1226
+ return listener;
1105
1227
  }
1106
1228
  }
1107
1229
  /**
@@ -1381,7 +1503,7 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
1381
1503
  ) {
1382
1504
  const DOMUtilsContext = this;
1383
1505
  if (typeof element === "string") {
1384
- element = PopsCore.document.querySelector(element) as HTMLElement;
1506
+ element = this.selector(element) as HTMLElement;
1385
1507
  }
1386
1508
  if (element == null) {
1387
1509
  return;
@@ -1468,7 +1590,7 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
1468
1590
  return PopsCore.window.document.documentElement.clientHeight;
1469
1591
  }
1470
1592
  if (typeof element === "string") {
1471
- element = PopsCore.document.querySelector(element) as HTMLElement;
1593
+ element = this.selector(element) as HTMLElement;
1472
1594
  }
1473
1595
  if (element == null) {
1474
1596
  return;
@@ -1547,7 +1669,7 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
1547
1669
  return PopsCore.window.innerWidth;
1548
1670
  }
1549
1671
  if (typeof element === "string") {
1550
- element = PopsCore.document.querySelector(element) as HTMLElement;
1672
+ element = this.selector(element) as HTMLElement;
1551
1673
  }
1552
1674
  if (element == null) {
1553
1675
  return;
@@ -1591,7 +1713,7 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
1591
1713
  return PopsCore.window.innerHeight;
1592
1714
  }
1593
1715
  if (typeof element === "string") {
1594
- element = PopsCore.document.querySelector(element) as HTMLElement;
1716
+ element = this.selector(element) as HTMLElement;
1595
1717
  }
1596
1718
  element = element as HTMLElement;
1597
1719
  if (isShow || (!isShow && popsDOMUtils.isShow(element))) {
@@ -2125,7 +2247,7 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
2125
2247
  * @param content 子元素或HTML字符串
2126
2248
  * @example
2127
2249
  * // 元素a.xx的内部末尾添加一个元素
2128
- * DOMUtils.append(document.querySelector("a.xx"),document.querySelector("b.xx"))
2250
+ * DOMUtils.append(document.querySelector("a.xx"), document.querySelector("b.xx"))
2129
2251
  * DOMUtils.append("a.xx","'<b class="xx"></b>")
2130
2252
  * */
2131
2253
  append(
@@ -2133,7 +2255,7 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
2133
2255
  content: HTMLElement | string | (HTMLElement | string | Element)[] | NodeList
2134
2256
  ) {
2135
2257
  if (typeof element === "string") {
2136
- element = PopsCore.document.querySelector(element) as HTMLElement;
2258
+ element = this.selector(element) as HTMLElement;
2137
2259
  }
2138
2260
  if (element == null) {
2139
2261
  return;
@@ -2262,7 +2384,7 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
2262
2384
  * */
2263
2385
  before(element: HTMLElement | Element | string, content: HTMLElement | string) {
2264
2386
  if (typeof element === "string") {
2265
- element = PopsCore.document.querySelector(element) as HTMLElement;
2387
+ element = this.selector(element) as HTMLElement;
2266
2388
  }
2267
2389
  if (element == null) {
2268
2390
  return;
@@ -2284,7 +2406,7 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
2284
2406
  * */
2285
2407
  after(element: HTMLElement | Element | string, content: HTMLElement | string) {
2286
2408
  if (typeof element === "string") {
2287
- element = PopsCore.document.querySelector(element) as HTMLElement;
2409
+ element = this.selector(element) as HTMLElement;
2288
2410
  }
2289
2411
  if (element == null) {
2290
2412
  return;
@@ -55,6 +55,13 @@ class PopsUtils {
55
55
  isDOM(target: any): boolean {
56
56
  return target instanceof Node;
57
57
  }
58
+ /**
59
+ * 判断是否是元素列表
60
+ * @param $ele
61
+ */
62
+ isNodeList($ele: any): $ele is any[] | NodeList {
63
+ return Array.isArray($ele) || $ele instanceof NodeList;
64
+ }
58
65
  /**
59
66
  * 删除对象上的属性
60
67
  * @param target