• js 触发长按事件


    <button id="btn1">长按触发</button>
    <button id="btn2">长按触发2</button>
    
    interface IOpt {
      el: HTMLElement;
      listener: EventListener;
      options?: boolean | AddEventListenerOptions;
    }
    
    function createBingEvent(event: boolean, types: string[]) {
      return ({ el, listener, options }: IOpt): Promise<IOpt> => {
        return new Promise((res) => {
          if (!event) return res({ el, listener, options });
    
          let timer: number | null;
          const clearTimer = () => {
            if (timer) {
              clearTimeout(timer);
              timer = null;
            }
          };
    
          types.forEach((type, index) => {
            el.addEventListener(
              type,
              (e) => {
                if (index === 0) {
                  if (timer) clearTimer();
                  timer = window.setTimeout(() => listener.call(el, e), 500);
                } else {
                  clearTimer();
                }
              },
              options
            );
          });
        });
      };
    }
    
    const pointTypes = ["pointerdown", "pointerup", "pointercancel"];
    const touchTypes = ["touchstart", "touchend", "touchcancel"];
    const mouseTypes = ["mousedown", "mouseup"];
    const chainPointerEvent = createBingEvent(!!window.PointerEvent, pointTypes);
    const chainTouchEvent = createBingEvent(!!window.TouchEvent, touchTypes);
    const chainMouseEvent = createBingEvent(!!window.MouseEvent, mouseTypes);
    
    export function bindLongEvent(
      el: HTMLElement,
      listener: EventListener,
      options?: boolean | AddEventListenerOptions
    ) {
      Promise.resolve({ el, listener, options })
        .then(chainPointerEvent)
        .then(chainTouchEvent)
        .then(chainMouseEvent);
    }
    
    bindLongEvent(document.getElementById("btn1")!, function (this: any, e) {
      console.log(this);
      console.log(e.type);
      console.log("触发长按事件");
    });
    bindLongEvent(document.getElementById("btn2")!, function (this: any, e) {
      console.log(this);
      console.log("hello world");
    });
    
  • 相关阅读:
    【转】C#中判断扫描枪输入与键盘输入
    根据名称分组,选择最大日期和最小日期的数据,并显示在一行上
    C#如何判断我的程序已经有一个实例正在运行
    消息队列篇
    Redis面试笔记(二)雪崩、穿透、击穿三连问
    MySQL基础
    Redis面试笔记(一)
    Java多线程(二)
    Java多线程(一)
    Elastic Search之布尔查询
  • 原文地址:https://www.cnblogs.com/ajanuw/p/12743024.html
Copyright © 2020-2023  润新知