@whitesev/domutils 1.9.12 → 2.0.0

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 = "1.9.12";
1
+ const version = "2.0.0";
2
2
 
3
3
  class WindowApi {
4
4
  /** 默认的配置 */
@@ -1351,12 +1351,6 @@ const GlobalData = {
1351
1351
  domEventSymbol: Symbol("events_" + (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)),
1352
1352
  };
1353
1353
 
1354
- const OriginPrototype = {
1355
- Object: {
1356
- defineProperty: Object.defineProperty,
1357
- },
1358
- };
1359
-
1360
1354
  class ElementEvent extends ElementAnimate {
1361
1355
  windowApi;
1362
1356
  constructor(windowApiOption) {
@@ -1456,6 +1450,9 @@ class ElementEvent extends ElementAnimate {
1456
1450
  listenerOption = getOption(args, 4, listenerOption);
1457
1451
  }
1458
1452
  $elList.forEach(($elItem) => {
1453
+ // window和document共用一个对象
1454
+ // 这样就能处理子元素选择器无法匹配的问题
1455
+ const targetIsWindow = CommonUtils.isWin($elItem);
1459
1456
  // 遍历事件名设置元素事件
1460
1457
  eventTypeList.forEach((eventName) => {
1461
1458
  /**
@@ -1490,12 +1487,7 @@ class ElementEvent extends ElementAnimate {
1490
1487
  else {
1491
1488
  $target = event.target;
1492
1489
  }
1493
- let $parent = $elItem;
1494
- if (CommonUtils.isWin($parent)) {
1495
- // window和document共用一个对象
1496
- // 这样就能处理子元素选择器无法匹配的问题
1497
- $parent = that.windowApi.document.documentElement;
1498
- }
1490
+ const $parent = targetIsWindow ? that.windowApi.document.documentElement : $elItem;
1499
1491
  const findValue = selectorList.find((selectors) => {
1500
1492
  // 判断目标元素是否匹配选择器
1501
1493
  if (that.matches($target, selectors)) {
@@ -1512,21 +1504,7 @@ class ElementEvent extends ElementAnimate {
1512
1504
  });
1513
1505
  if (findValue) {
1514
1506
  // 这里尝试使用defineProperty修改event的target值
1515
- const originTarget = event.target;
1516
- try {
1517
- OriginPrototype.Object.defineProperty(event, "target", {
1518
- get() {
1519
- return $target;
1520
- },
1521
- });
1522
- OriginPrototype.Object.defineProperty(event, "originTarget", {
1523
- get() {
1524
- return originTarget;
1525
- },
1526
- });
1527
- // oxlint-disable-next-line no-empty
1528
- }
1529
- catch { }
1507
+ // 不建议使用覆盖target,因为可能会有兼容性问题
1530
1508
  execCallback = true;
1531
1509
  call_this = $target;
1532
1510
  call_event = event;
@@ -1692,6 +1670,9 @@ class ElementEvent extends ElementAnimate {
1692
1670
  if (handlers.length === 0) {
1693
1671
  // 如果没有任意的handler,那么删除该属性
1694
1672
  CommonUtils.delete(elementEvents, eventType);
1673
+ if (Object.keys(elementEvents).length === 0) {
1674
+ CommonUtils.delete($elItem, GlobalData.domEventSymbol);
1675
+ }
1695
1676
  }
1696
1677
  });
1697
1678
  Reflect.set($elItem, GlobalData.domEventSymbol, elementEvents);
@@ -1726,11 +1707,11 @@ class ElementEvent extends ElementAnimate {
1726
1707
  }
1727
1708
  $elList.forEach(($elItem) => {
1728
1709
  const symbolList = [...new Set([...Object.getOwnPropertySymbols($elItem), GlobalData.domEventSymbol])];
1729
- symbolList.forEach((symbolItem) => {
1730
- if (!symbolItem.toString().startsWith("Symbol(events_")) {
1710
+ symbolList.forEach((__symbol__) => {
1711
+ if (!__symbol__.toString().startsWith("Symbol(events_")) {
1731
1712
  return;
1732
1713
  }
1733
- const elementEvents = Reflect.get($elItem, symbolItem) || {};
1714
+ const elementEvents = Reflect.get($elItem, __symbol__) || {};
1734
1715
  const iterEventNameList = eventTypeList.length ? eventTypeList : Object.keys(elementEvents);
1735
1716
  iterEventNameList.forEach((eventName) => {
1736
1717
  const handlers = elementEvents[eventName];
@@ -1742,8 +1723,11 @@ class ElementEvent extends ElementAnimate {
1742
1723
  capture: handler.option.capture,
1743
1724
  });
1744
1725
  }
1745
- const events = Reflect.get($elItem, symbolItem);
1726
+ const events = Reflect.get($elItem, __symbol__);
1746
1727
  CommonUtils.delete(events, eventName);
1728
+ if (Object.keys(events).length === 0) {
1729
+ CommonUtils.delete($elItem, __symbol__);
1730
+ }
1747
1731
  });
1748
1732
  });
1749
1733
  });
@@ -2370,7 +2354,7 @@ class ElementEvent extends ElementAnimate {
2370
2354
  },
2371
2355
  };
2372
2356
  }
2373
- onDoubleClick(...args) {
2357
+ onOneOrDouble(...args) {
2374
2358
  const $el = args[0];
2375
2359
  let selector = void 0;
2376
2360
  let handler;
@@ -2401,12 +2385,21 @@ class ElementEvent extends ElementAnimate {
2401
2385
  else {
2402
2386
  throw new Error("args length error");
2403
2387
  }
2404
- let clickMap = new WeakMap();
2405
- let isDoubleClick = false;
2388
+ let eventNodeMap = new WeakMap();
2389
+ let isDouble = false;
2406
2390
  let timer = void 0;
2391
+ let eventType = "pointerup";
2407
2392
  /** 检测是否是单击的延迟时间 */
2408
- const checkClickTime = 200;
2409
- const dblclick_handler = (evt, option, $selector) => {
2393
+ let checkClickTime = 200;
2394
+ if (typeof options === "object" && options != null) {
2395
+ if (typeof options.eventType === "string" || Array.isArray(options.eventType)) {
2396
+ eventType = options.eventType;
2397
+ }
2398
+ if (typeof options.checkClickTime === "number") {
2399
+ checkClickTime = options.checkClickTime;
2400
+ }
2401
+ }
2402
+ const callback = (evt, option, $selector) => {
2410
2403
  if ($selector) {
2411
2404
  return handler(evt, $selector, option);
2412
2405
  }
@@ -2414,35 +2407,34 @@ class ElementEvent extends ElementAnimate {
2414
2407
  return handler(evt, option);
2415
2408
  }
2416
2409
  };
2417
- const pointerUpListener = this.on($el, "pointerup", selector, (evt, $selector) => {
2418
- // this.preventEvent(evt);
2410
+ const pointerUpListener = this.on($el, eventType, selector, (evt, $selector) => {
2419
2411
  clearTimeout(timer);
2420
2412
  timer = void 0;
2421
- if (isDoubleClick && clickMap.has($selector)) {
2422
- isDoubleClick = false;
2423
- clickMap.delete($selector);
2424
- /* 判定为双击 */
2425
- dblclick_handler(evt, {
2413
+ if (isDouble && eventNodeMap.has($selector)) {
2414
+ isDouble = false;
2415
+ eventNodeMap.delete($selector);
2416
+ // 判定为双次
2417
+ callback(evt, {
2426
2418
  isDoubleClick: true,
2427
2419
  }, $selector);
2428
2420
  }
2429
2421
  else {
2430
2422
  timer = setTimeout(() => {
2431
- isDoubleClick = false;
2432
- // 判断为单击
2433
- dblclick_handler(evt, {
2423
+ isDouble = false;
2424
+ // 判断为单次
2425
+ callback(evt, {
2434
2426
  isDoubleClick: false,
2435
2427
  }, $selector);
2436
2428
  }, checkClickTime);
2437
- isDoubleClick = true;
2438
- clickMap.set($selector, evt);
2429
+ isDouble = true;
2430
+ eventNodeMap.set($selector, evt);
2439
2431
  }
2440
2432
  }, options);
2441
2433
  return {
2442
2434
  off() {
2443
2435
  pointerUpListener.off();
2444
2436
  // @ts-expect-error
2445
- clickMap = null;
2437
+ eventNodeMap = null;
2446
2438
  },
2447
2439
  };
2448
2440
  }