balm-ui
Version:
A modular and customizable UI library based on Material Design and Vue 3
70 lines (63 loc) • 1.7 kB
JavaScript
import getType from '../utils/typeof';
function handlePress(el, { callback, delay }) {
// 定义变量
let pressTimer = null;
// 创建计时器( 2秒后执行函数 )
function start(e) {
if (e.type === 'click' && e.button !== 0) {
return;
}
if (pressTimer === null) {
pressTimer = setTimeout(() => {
handler(e);
}, delay || 2e3);
}
}
// 取消计时器
function cancel(e) {
if (pressTimer !== null) {
clearTimeout(pressTimer);
pressTimer = null;
}
}
// 运行函数
function handler(e) {
callback(e);
}
// 添加事件监听器
el.addEventListener('mousedown', start);
el.addEventListener('touchstart', start);
// 取消计时器
el.addEventListener('click', cancel);
el.addEventListener('mouseout', cancel);
el.addEventListener('touchend', cancel);
el.addEventListener('touchcancel', cancel);
}
const vLongpress = {
name: 'longpress',
beforeMount(el, { value }) {
if (getType(value) === 'function') {
handlePress(el, {
callback: value
});
} else if (getType(value) === 'object') {
if (getType(value.callback) !== 'function') {
console.warn(`[v-longpress]: The 'callback' must be a function`);
}
handlePress(el, value);
} else {
throw new Error(
`[v-longpress]: The 'value' must be an object ({ callback: Function, delay?: number })`
);
}
},
// 当传进来的值更新的时候触发
updated(el, { value }) {
el.$value = value;
},
// 指令与元素解绑的时候,移除事件绑定
unmounted(el) {
el.removeEventListener('click', el.handler);
}
};
export default vLongpress;