|
@@ -0,0 +1,63 @@
|
|
|
|
|
+// src/directives/preventReClick.js
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 防重复点击指令
|
|
|
|
|
+ * 使用方式:v-preventReClick 或 v-preventReClick="延迟时间(毫秒)"
|
|
|
|
|
+ * 示例:v-preventReClick="1500" 表示1.5秒内禁止重复点击
|
|
|
|
|
+ */
|
|
|
|
|
+export default {
|
|
|
|
|
+ install(Vue) {
|
|
|
|
|
+ // 注册全局自定义指令
|
|
|
|
|
+ Vue.directive('preventReClick', {
|
|
|
|
|
+ bind(el, binding) {
|
|
|
|
|
+ // 存储原始点击事件(兼容@click绑定的方法)
|
|
|
|
|
+ el.__originClick__ = el.onclick
|
|
|
|
|
+
|
|
|
|
|
+ // 自定义延迟时间,默认1000ms
|
|
|
|
|
+ const delay = binding.value || 1000
|
|
|
|
|
+
|
|
|
|
|
+ // 重写点击事件
|
|
|
|
|
+ el.onclick = function(...args) {
|
|
|
|
|
+ // 已锁定则直接返回
|
|
|
|
|
+ if (el.__isLocked__) return
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 锁定状态:标记为已点击
|
|
|
|
|
+ el.__isLocked__ = true
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 禁用按钮(针对button/input等可禁用元素)
|
|
|
|
|
+ if (el.tagName === 'BUTTON' || el.type === 'button') {
|
|
|
|
|
+ el.disabled = true
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 添加禁用样式类(方便自定义样式)
|
|
|
|
|
+ el.classList.add('prevent-reclick-disabled')
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 执行原始点击事件
|
|
|
|
|
+ if (typeof el.__originClick__ === 'function') {
|
|
|
|
|
+ el.__originClick__.apply(this, args)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 延迟解锁
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ el.__isLocked__ = false
|
|
|
|
|
+ if (el.tagName === 'BUTTON' || el.type === 'button') {
|
|
|
|
|
+ el.disabled = false
|
|
|
|
|
+ }
|
|
|
|
|
+ el.classList.remove('prevent-reclick-disabled')
|
|
|
|
|
+ }, delay)
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 指令更新时重新绑定(比如延迟时间动态变化)
|
|
|
|
|
+ update(el, binding) {
|
|
|
|
|
+ el.__delay__ = binding.value || 1000
|
|
|
|
|
+ },
|
|
|
|
|
+ // 指令解绑时清理,避免内存泄漏
|
|
|
|
|
+ unbind(el) {
|
|
|
|
|
+ el.onclick = el.__originClick__
|
|
|
|
|
+ delete el.__originClick__
|
|
|
|
|
+ delete el.__isLocked__
|
|
|
|
|
+ delete el.__delay__
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+}
|