liming 1 week ago
parent
commit
7cb77b0a0f
1 changed files with 59 additions and 47 deletions
  1. 59 47
      src/directives/longpress.js

+ 59 - 47
src/directives/longpress.js

@@ -1,84 +1,96 @@
+// src/directives/longPress.js
 export default {
   mounted(el, binding) {
+    // 默认长按时间为1000ms(1秒)
+    const duration = binding.arg || 1000;
     let pressTimer = null;
     let hasLongPressed = false;
-    const duration = binding.arg || 1000; // 默认1秒
 
-    // 开始按压
-    const start = (e) => {
+    // 开始按压处理
+    const startPress = (e) => {
       // 防止重复触发
       if (pressTimer !== null) return;
-
+      
       // 重置状态
       hasLongPressed = false;
-
-      // 设置时器
+      
+      // 设置长按计时器
       pressTimer = setTimeout(() => {
         hasLongPressed = true;
         // 触发长按回调
-        if (typeof binding.value === "function") {
-          binding.value(e, "longpress");
-        } else if (binding.value?.longpress) {
-          binding.value.longpress(e);
-        }
+        triggerCallback('longpress', e);
       }, duration);
     };
 
-    // 结束按压
-    const end = (e) => {
-      // 清除时器
+    // 结束按压处理
+    const endPress = (e) => {
+      // 清除时器
       if (pressTimer) {
         clearTimeout(pressTimer);
         pressTimer = null;
       }
-
-      // 如果已经触发了长按,则执行release回调
+      
+      // 无论是否达到长按时间,都触发放开回调
+      triggerCallback('release', e);
+      
+      // 如果达到了长按时间,触发长按放开回调
       if (hasLongPressed) {
-        if (binding.value?.release) {
-          binding.value.release(e);
-        }
+        triggerCallback('longpressRelease', e);
       }
-      // 否则执行pressEnd回调(未达到长按时间就放开)
-      else {
-        if (binding.value?.pressEnd) {
-          binding.value.pressEnd(e);
-        }
-      }
-
+      
       hasLongPressed = false;
     };
 
     // 取消按压(鼠标移出元素)
-    const cancel = (e) => {
+    const cancelPress = (e) => {
       if (pressTimer) {
         clearTimeout(pressTimer);
         pressTimer = null;
+        // 取消时也触发release
+        triggerCallback('release', e);
         hasLongPressed = false;
       }
     };
 
-    // 添加事件监听
-    el.addEventListener("mousedown", start);
-    el.addEventListener("touchstart", start);
-    el.addEventListener("click", end);
-    el.addEventListener("mouseup", end);
-    el.addEventListener("mouseleave", cancel);
-    el.addEventListener("touchend", end);
-    el.addEventListener("touchcancel", cancel);
+    // 触发回调函数
+    const triggerCallback = (type, event) => {
+      if (typeof binding.value === 'function') {
+        // 函数形式:传入事件和类型
+        binding.value(event, type);
+      } else if (typeof binding.value === 'object') {
+        // 对象形式:调用对应方法
+        binding.value[type]?.(event);
+      }
+    };
 
-    // 保存以便卸载时移除
-    el._longPressHandlers = { start, end, cancel };
+    // 添加事件监听
+    el._longPressHandlers = { startPress, endPress, cancelPress };
+    
+    // 鼠标事件
+    el.addEventListener('mousedown', startPress);
+    el.addEventListener('mouseup', endPress);
+    el.addEventListener('mouseleave', cancelPress);
+    
+    // 触摸事件(移动端支持)
+    el.addEventListener('touchstart', startPress);
+    el.addEventListener('touchend', endPress);
+    el.addEventListener('touchcancel', cancelPress);
   },
 
   unmounted(el) {
     // 移除事件监听
-    const { start, end, cancel } = el._longPressHandlers || {};
-    if (start) el.removeEventListener("mousedown", start);
-    if (start) el.removeEventListener("touchstart", start);
-    if (end) el.removeEventListener("click", end);
-    if (end) el.removeEventListener("mouseup", end);
-    if (cancel) el.removeEventListener("mouseleave", cancel);
-    if (end) el.removeEventListener("touchend", end);
-    if (cancel) el.removeEventListener("touchcancel", cancel);
-  },
-};
+    const { startPress, endPress, cancelPress } = el._longPressHandlers || {};
+    if (startPress) {
+      el.removeEventListener('mousedown', startPress);
+      el.removeEventListener('touchstart', startPress);
+    }
+    if (endPress) {
+      el.removeEventListener('mouseup', endPress);
+      el.removeEventListener('touchend', endPress);
+    }
+    if (cancelPress) {
+      el.removeEventListener('mouseleave', cancelPress);
+      el.removeEventListener('touchcancel', cancelPress);
+    }
+  }
+};