|
@@ -0,0 +1,84 @@
|
|
|
+export default {
|
|
|
+ mounted(el, binding) {
|
|
|
+ let pressTimer = null;
|
|
|
+ let hasLongPressed = false;
|
|
|
+ const duration = binding.arg || 1000; // 默认1秒
|
|
|
+
|
|
|
+ // 开始按压
|
|
|
+ const start = (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);
|
|
|
+ }
|
|
|
+ }, duration);
|
|
|
+ };
|
|
|
+
|
|
|
+ // 结束按压
|
|
|
+ const end = (e) => {
|
|
|
+ // 清除定时器
|
|
|
+ if (pressTimer) {
|
|
|
+ clearTimeout(pressTimer);
|
|
|
+ pressTimer = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果已经触发了长按,则执行release回调
|
|
|
+ if (hasLongPressed) {
|
|
|
+ if (binding.value?.release) {
|
|
|
+ binding.value.release(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 否则执行pressEnd回调(未达到长按时间就放开)
|
|
|
+ else {
|
|
|
+ if (binding.value?.pressEnd) {
|
|
|
+ binding.value.pressEnd(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ hasLongPressed = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 取消按压(鼠标移出元素)
|
|
|
+ const cancel = (e) => {
|
|
|
+ if (pressTimer) {
|
|
|
+ clearTimeout(pressTimer);
|
|
|
+ pressTimer = null;
|
|
|
+ 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);
|
|
|
+
|
|
|
+ // 保存以便卸载时移除
|
|
|
+ el._longPressHandlers = { start, end, cancel };
|
|
|
+ },
|
|
|
+
|
|
|
+ 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);
|
|
|
+ },
|
|
|
+};
|