Blame view

天文台pc/tianwentai-ui/node_modules/motion-dom/dist/es/gestures/hover.mjs 2.61 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  import { isDragActive } from './drag/state/is-active.mjs';
  import { setupGesture } from './utils/setup.mjs';
  
  function isValidHover(event) {
      return !(event.pointerType === "touch" || isDragActive());
  }
  /**
   * Create a hover gesture. hover() is different to .addEventListener("pointerenter")
   * in that it has an easier syntax, filters out polyfilled touch events, interoperates
   * with drag gestures, and automatically removes the "pointerennd" event listener when the hover ends.
   *
   * @public
   */
  function hover(elementOrSelector, onHoverStart, options = {}) {
      const [elements, eventOptions, cancel] = setupGesture(elementOrSelector, options);
      elements.forEach((element) => {
          let isPressed = false;
          let deferredHoverEnd = false;
          let hoverEndCallback;
          const removePointerLeave = () => {
              element.removeEventListener("pointerleave", onPointerLeave);
          };
          const endHover = (event) => {
              if (hoverEndCallback) {
                  hoverEndCallback(event);
                  hoverEndCallback = undefined;
              }
              removePointerLeave();
          };
          const onPointerUp = (event) => {
              isPressed = false;
              window.removeEventListener("pointerup", onPointerUp);
              window.removeEventListener("pointercancel", onPointerUp);
              if (deferredHoverEnd) {
                  deferredHoverEnd = false;
                  endHover(event);
              }
          };
          const onPointerDown = () => {
              isPressed = true;
              window.addEventListener("pointerup", onPointerUp, eventOptions);
              window.addEventListener("pointercancel", onPointerUp, eventOptions);
          };
          const onPointerLeave = (leaveEvent) => {
              if (leaveEvent.pointerType === "touch")
                  return;
              if (isPressed) {
                  deferredHoverEnd = true;
                  return;
              }
              endHover(leaveEvent);
          };
          const onPointerEnter = (enterEvent) => {
              if (!isValidHover(enterEvent))
                  return;
              deferredHoverEnd = false;
              const onHoverEnd = onHoverStart(element, enterEvent);
              if (typeof onHoverEnd !== "function")
                  return;
              hoverEndCallback = onHoverEnd;
              element.addEventListener("pointerleave", onPointerLeave, eventOptions);
          };
          element.addEventListener("pointerenter", onPointerEnter, eventOptions);
          element.addEventListener("pointerdown", onPointerDown, eventOptions);
      });
      return cancel;
  }
  
  export { hover };
  //# sourceMappingURL=hover.mjs.map