12345678910111213141516171819202122232425262728293031 |
- /**
- * Prevent repeated clicks
- * @Example v-repeat-click="()=>{}"
- */
- import { on, once } from '/@/utils/domUtils';
- import type { Directive, DirectiveBinding } from 'vue';
- 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: Event): void => {
- if ((e as MouseEvent).button !== 0) return;
- startTime = Date.now();
- once(document as any, 'mouseup', clear);
- interval && clearInterval(interval);
- interval = setInterval(handler, 100);
- });
- },
- };
- export default repeatDirective;
|