vue实现esc关闭div弹窗的自定义指令

弹窗是 div 实现的(非el-dialog),效果:按下esc,关闭弹窗

directive/divEscClose/divEscClose.js
export default {
  bind: function (el, binding, vnode) {
    let keydownHandler;
​
    const closeModal = () => {
      if (typeof binding.value === 'function') {
        binding.value();
      }
    };
​
    keydownHandler = e => {
      if (e.key === 'Escape') {
        closeModal();
      }
    };
​
    document.addEventListener('keydown', keydownHandler);
​
    vnode.context.$once('hook:beforeDestroy', () => {
      document.removeEventListener('keydown', keydownHandler);
    });
​
    // 将事件处理器存储在指令的私有变量中
    el._keydownHandler = keydownHandler;
  },
  unbind: function (el) {
    // 从元素中获取并移除事件监听器
    const keydownHandler = el._keydownHandler;
    if (keydownHandler) {
      document.removeEventListener('keydown', keydownHandler);
      delete el._keydownHandler; // 清理私有变量
    }
  },
}

directive/index.js
​​​​​​​import divEscClose from "@/directive/divEscClose/divEscClose";
​
const install = function (Vue) {
 Vue.directive("divEscClose", divEscClose);
};
​
export default install;
xxx.vue
<div
    v-div-esc-close="hideDialog"
    class="dialogBox">
</div>
​
<script>
    hideDialog() {
        // doSomething...
    }
</script>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值