directive封装一个长按事件

发布于 2024-04-29  304 次阅读


directive/index.ts

const longPress = {
    beforeMount(el, binding, vnode){
        let timer;
        let interval = binding.value.interval || 1000;

        el.addEventListener('mousedown', (e) => {
          timer = setTimeout(() => {
            binding.value.handler(e);
          }, interval);
          e.preventDefault();
        });

        document.addEventListener('mouseup', () => {
          clearTimeout(timer);
        });

        el.addEventListener('touchstart', (e) => {
          timer = setTimeout(() => {
            binding.value.handler(e);
          }, interval);
        //   e.preventDefault();阻止默认的click事件
        });

        document.addEventListener('touchend', (e) => {
          clearTimeout(timer);
        });

    }
}
export { longPress };

main.ts全局注册

import { debounce,longPress } from "./directive/index.ts";
app.directive('longPress',longPress);

页面中使用

     <li v-longPress="{ interval: 2000,             handler:changeFn,index:index }">

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。