初始版本提交
This commit is contained in:
31
src/directives/repeatClick.ts
Normal file
31
src/directives/repeatClick.ts
Normal file
@ -0,0 +1,31 @@
|
||||
/**
|
||||
* 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: 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;
|
||||
Reference in New Issue
Block a user