You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
859 B
32 lines
859 B
/** |
|
* Prevent repeated clicks |
|
* @Example v-repeat-click="()=>{}" |
|
*/ |
|
import type { Directive, DirectiveBinding } from 'vue' |
|
import { on, once } from '@/utils/domUtils' |
|
|
|
const repeatDirective: Directive = { |
|
beforeMount(el: Element, binding: DirectiveBinding<any>) { |
|
let interval: Nullable<IntervalHandle> = null |
|
let startTime = 0 |
|
const handler = (): void => binding?.value() |
|
const clear = (): void => { |
|
if (Date.now() - startTime < 100) |
|
handler() |
|
|
|
interval && clearInterval(interval) |
|
interval = null |
|
} |
|
|
|
on(el, 'mousedown', (e: MouseEvent): void => { |
|
if ((e as any).button !== 0) |
|
return |
|
startTime = Date.now() |
|
once(document as any, 'mouseup', clear) |
|
interval && clearInterval(interval) |
|
interval = setInterval(handler, 100) |
|
}) |
|
}, |
|
} |
|
|
|
export default repeatDirective
|
|
|