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