@whitesev/pops 4.2.0 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- const version = "4.2.0";
1
+ const version = "4.2.1";
2
2
 
3
3
  const GlobalConfig = {
4
4
  config: {},
@@ -814,7 +814,7 @@ class PopsDOMUtilsEvent {
814
814
  * @param startIndex
815
815
  * @param option
816
816
  */
817
- function getOption(args, startIndex, option) {
817
+ const getOption = function (args, startIndex, option) {
818
818
  const currentParam = args[startIndex];
819
819
  if (typeof currentParam === "boolean") {
820
820
  option.capture = currentParam;
@@ -836,7 +836,7 @@ class PopsDOMUtilsEvent {
836
836
  option.isComposedPath = currentParam.isComposedPath;
837
837
  }
838
838
  return option;
839
- }
839
+ };
840
840
  const that = this;
841
841
  // eslint-disable-next-line prefer-rest-params
842
842
  const args = arguments;
@@ -851,8 +851,7 @@ class PopsDOMUtilsEvent {
851
851
  }
852
852
  let $elList = [];
853
853
  if (element instanceof NodeList || Array.isArray(element)) {
854
- element = element;
855
- $elList = [...element];
854
+ $elList = $elList.concat(Array.from(element));
856
855
  }
857
856
  else {
858
857
  $elList.push(element);
@@ -860,15 +859,15 @@ class PopsDOMUtilsEvent {
860
859
  // 事件名
861
860
  let eventTypeList = [];
862
861
  if (Array.isArray(eventType)) {
863
- eventTypeList = eventTypeList.concat(eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== ""));
862
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
864
863
  }
865
864
  else if (typeof eventType === "string") {
866
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
865
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
867
866
  }
868
867
  // 子元素选择器
869
868
  let selectorList = [];
870
869
  if (Array.isArray(selector)) {
871
- selectorList = selectorList.concat(selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== ""));
870
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
872
871
  }
873
872
  else if (typeof selector === "string") {
874
873
  selectorList.push(selector);
@@ -895,39 +894,52 @@ class PopsDOMUtilsEvent {
895
894
  /**
896
895
  * 如果是once,那么删除该监听和元素上的事件和监听
897
896
  */
898
- function checkOptionOnceToRemoveEventListener() {
897
+ const checkOptionOnceToRemoveEventListener = ($el) => {
899
898
  if (listenerOption.once) {
900
- that.off(element, eventType, selector, callback, option);
899
+ this.off($el, eventTypeList, selector, callback, option);
901
900
  }
902
- }
903
- $elList.forEach((elementItem) => {
901
+ };
902
+ $elList.forEach(($elItem) => {
904
903
  /**
905
904
  * 事件回调
906
905
  * @param event
907
906
  */
908
- function domUtilsEventCallBack(event) {
907
+ const handlerCallBack = function (event) {
908
+ let call_this = void 0;
909
+ let call_event = void 0;
910
+ let call_$selector = void 0;
911
+ let execCallback = false;
909
912
  if (selectorList.length) {
910
913
  // 存在子元素选择器
911
914
  // 这时候的this和target都是子元素选择器的元素
912
- let eventTarget = listenerOption.isComposedPath
913
- ? event.composedPath()[0]
914
- : event.target;
915
- let totalParent = elementItem;
916
- if (popsUtils.isWin(totalParent)) {
917
- if (totalParent === PopsCore.document) {
918
- totalParent = PopsCore.document.documentElement;
915
+ let $target;
916
+ if (listenerOption.isComposedPath) {
917
+ // 可能为空
918
+ const composedPath = event.composedPath();
919
+ if (!composedPath.length && event.target) {
920
+ composedPath.push(event.target);
919
921
  }
922
+ $target = composedPath[0];
923
+ }
924
+ else {
925
+ $target = event.target;
920
926
  }
921
- const findValue = selectorList.find((selectorItem) => {
927
+ let $parent = $elItem;
928
+ if (popsUtils.isWin($parent)) {
929
+ // window和document共用一个对象
930
+ // 这样就能处理子元素选择器无法匹配的问题
931
+ $parent = PopsCore.document.documentElement;
932
+ }
933
+ const findValue = selectorList.find((selectors) => {
922
934
  // 判断目标元素是否匹配选择器
923
- if (that.matches(eventTarget, selectorItem)) {
935
+ if (that.matches($target, selectors)) {
924
936
  // 当前目标可以被selector所匹配到
925
937
  return true;
926
938
  }
927
939
  // 在上层与主元素之间寻找可以被selector所匹配到的
928
- const $closestMatches = that.closest(eventTarget, selectorItem);
929
- if ($closestMatches && totalParent?.contains($closestMatches)) {
930
- eventTarget = $closestMatches;
940
+ const $closestMatches = that.closest($target, selectors);
941
+ if ($closestMatches && $parent?.contains?.($closestMatches)) {
942
+ $target = $closestMatches;
931
943
  return true;
932
944
  }
933
945
  return false;
@@ -937,38 +949,47 @@ class PopsDOMUtilsEvent {
937
949
  try {
938
950
  OriginPrototype.Object.defineProperty(event, "target", {
939
951
  get() {
940
- return eventTarget;
952
+ return $target;
941
953
  },
942
954
  });
955
+ // oxlint-disable-next-line no-empty
943
956
  }
944
- catch {
945
- // 忽略
946
- }
947
- listenerCallBack.call(eventTarget, event, eventTarget);
948
- checkOptionOnceToRemoveEventListener();
957
+ catch { }
958
+ execCallback = true;
959
+ call_this = $target;
960
+ call_event = event;
961
+ call_$selector = $target;
949
962
  }
950
963
  }
951
964
  else {
952
- // 这时候的this指向监听的元素
953
- listenerCallBack.call(elementItem, event);
954
- checkOptionOnceToRemoveEventListener();
965
+ execCallback = true;
966
+ call_this = $elItem;
967
+ call_event = event;
968
+ }
969
+ if (execCallback) {
970
+ const result = listenerCallBack.call(call_this, call_event, call_$selector);
971
+ checkOptionOnceToRemoveEventListener($elItem);
972
+ if (typeof result === "boolean" && !result) {
973
+ return false;
974
+ }
955
975
  }
956
- }
976
+ };
957
977
  // 遍历事件名设置元素事件
958
978
  eventTypeList.forEach((eventName) => {
959
- elementItem.addEventListener(eventName, domUtilsEventCallBack, listenerOption);
979
+ // add listener
980
+ $elItem.addEventListener(eventName, handlerCallBack, listenerOption);
960
981
  // 获取对象上的事件
961
- const elementEvents = Reflect.get(elementItem, SymbolEvents) || {};
982
+ const elementEvents = Reflect.get($elItem, SymbolEvents) || {};
962
983
  // 初始化对象上的xx事件
963
984
  elementEvents[eventName] = elementEvents[eventName] || [];
964
985
  elementEvents[eventName].push({
965
986
  selector: selectorList,
966
987
  option: listenerOption,
967
- callback: domUtilsEventCallBack,
968
- originCallBack: listenerCallBack,
988
+ handlerCallBack: handlerCallBack,
989
+ callback: listenerCallBack,
969
990
  });
970
991
  // 覆盖事件
971
- Reflect.set(elementItem, SymbolEvents, elementEvents);
992
+ Reflect.set($elItem, SymbolEvents, elementEvents);
972
993
  });
973
994
  });
974
995
  return {
@@ -981,11 +1002,11 @@ class PopsDOMUtilsEvent {
981
1002
  },
982
1003
  /**
983
1004
  * 主动触发事件
984
- * @param details 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
985
- * @param useDispatchToEmit 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了selectorTarget的没有值
1005
+ * @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
1006
+ * @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了`$selector`的没有值
986
1007
  */
987
- emit: (details, useDispatchToEmit) => {
988
- that.emit($elList, eventTypeList, details, useDispatchToEmit);
1008
+ emit: (extraDetails, useDispatchToTriggerEvent) => {
1009
+ that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
989
1010
  },
990
1011
  };
991
1012
  }
@@ -996,7 +1017,7 @@ class PopsDOMUtilsEvent {
996
1017
  * @param startIndex
997
1018
  * @param option
998
1019
  */
999
- function getOption(args1, startIndex, option) {
1020
+ const getOption = function (args1, startIndex, option) {
1000
1021
  const currentParam = args1[startIndex];
1001
1022
  if (typeof currentParam === "boolean") {
1002
1023
  option.capture = currentParam;
@@ -1005,12 +1026,12 @@ class PopsDOMUtilsEvent {
1005
1026
  option.capture = currentParam.capture;
1006
1027
  }
1007
1028
  return option;
1008
- }
1009
- const DOMUtilsContext = this;
1029
+ };
1030
+ const that = this;
1010
1031
  // eslint-disable-next-line prefer-rest-params
1011
1032
  const args = arguments;
1012
1033
  if (typeof element === "string") {
1013
- element = DOMUtilsContext.selectorAll(element);
1034
+ element = that.selectorAll(element);
1014
1035
  }
1015
1036
  if (element == null) {
1016
1037
  return;
@@ -1018,22 +1039,22 @@ class PopsDOMUtilsEvent {
1018
1039
  let $elList = [];
1019
1040
  if (element instanceof NodeList || Array.isArray(element)) {
1020
1041
  element = element;
1021
- $elList = $elList.concat(element);
1042
+ $elList = $elList.concat(Array.from(element));
1022
1043
  }
1023
1044
  else {
1024
1045
  $elList.push(element);
1025
1046
  }
1026
1047
  let eventTypeList = [];
1027
1048
  if (Array.isArray(eventType)) {
1028
- eventTypeList = eventTypeList.concat(eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== ""));
1049
+ eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
1029
1050
  }
1030
1051
  else if (typeof eventType === "string") {
1031
- eventTypeList = eventTypeList.concat(eventType.split(" ").filter((eventTypeItem) => eventTypeItem !== ""));
1052
+ eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
1032
1053
  }
1033
1054
  // 子元素选择器
1034
1055
  let selectorList = [];
1035
1056
  if (Array.isArray(selector)) {
1036
- selectorList = selectorList.concat(selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== ""));
1057
+ selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
1037
1058
  }
1038
1059
  else if (typeof selector === "string") {
1039
1060
  selectorList.push(selector);
@@ -1062,16 +1083,16 @@ class PopsDOMUtilsEvent {
1062
1083
  // 目标函数、事件名、回调函数、事件配置、过滤函数
1063
1084
  filter = option;
1064
1085
  }
1065
- $elList.forEach((elementItem) => {
1086
+ $elList.forEach(($elItem) => {
1066
1087
  // 获取对象上的事件
1067
- const elementEvents = Reflect.get(elementItem, SymbolEvents) || {};
1088
+ const elementEvents = Reflect.get($elItem, SymbolEvents) || {};
1068
1089
  eventTypeList.forEach((eventName) => {
1069
1090
  const handlers = elementEvents[eventName] || [];
1070
1091
  const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
1071
1092
  for (let index = 0; index < filterHandler.length; index++) {
1072
1093
  const handler = filterHandler[index];
1073
1094
  let flag = true;
1074
- if (flag && listenerCallBack && handler.originCallBack !== listenerCallBack) {
1095
+ if (flag && listenerCallBack && handler.callback !== listenerCallBack) {
1075
1096
  // callback不同
1076
1097
  flag = false;
1077
1098
  }
@@ -1088,7 +1109,7 @@ class PopsDOMUtilsEvent {
1088
1109
  flag = false;
1089
1110
  }
1090
1111
  if (flag) {
1091
- elementItem.removeEventListener(eventName, handler.callback, handler.option);
1112
+ $elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
1092
1113
  const findIndex = handlers.findIndex((item) => item === handler);
1093
1114
  if (findIndex !== -1) {
1094
1115
  handlers.splice(findIndex, 1);
@@ -1100,7 +1121,7 @@ class PopsDOMUtilsEvent {
1100
1121
  popsUtils.delete(elementEvents, eventType);
1101
1122
  }
1102
1123
  });
1103
- Reflect.set(elementItem, SymbolEvents, elementEvents);
1124
+ Reflect.set($elItem, SymbolEvents, elementEvents);
1104
1125
  });
1105
1126
  }
1106
1127
  /**
@@ -1484,11 +1505,11 @@ class PopsDOMUtilsEvent {
1484
1505
  * 阻止事件的默认行为发生,并阻止事件传播
1485
1506
  */
1486
1507
  const stopEvent = (event, onlyStopPropagation) => {
1508
+ // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1509
+ event?.stopPropagation();
1510
+ // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1511
+ event?.stopImmediatePropagation();
1487
1512
  if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
1488
- // 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
1489
- event?.stopPropagation();
1490
- // 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
1491
- event?.stopImmediatePropagation();
1492
1513
  return;
1493
1514
  }
1494
1515
  // 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字