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");
});
posted @ 2020-04-21 10:53  Ajanuw  阅读(2212)  评论(0编辑  收藏  举报