vue自定义热键、自定义快捷键组合,vue阻止默认事件

需求:

思路:

1、通过监听window.addEventListener,键盘事件KeyDown,获取按下的键的keyCode

2、按下什么键就把什么键的keyCode存起来,当存起来的keyCode符合你自定义的热键组合时,就触发自定义方法

注意:

window.addEventListener监听事件当按下键盘某键后,会一直触发直到抬起keyup后

window.addEventListener监听事件需要手动销毁

比对存起来的keyCode是否符合自定义热键时,要注意热键的顺序(例:ctrl + S,反过来S+ctrl是不需要触发的)

某些自定义快捷键组合可能会与浏览器的默认快捷键冲突,需要先阻止浏览器默认事件

代码:

  data() {
    return {
      key: [],
      timer: null,
      dataList: [
        {
          list: [17, 187],
          msg: "ctrl +",
        },
        {
          list: [17, 107],
          msg: "ctrl +",
        },
        {
          list: [17, 83],
          msg: "ctrl S",
        },
        {
          list: [17, 85],
          msg: "ctrl U",
        },
        {
          list: [17, 82],
          msg: "ctrl R",
        },
        {
          list: [17, 75],
          msg: "ctrl K",
        },
        {
          list: [17, 13],
          msg: "ctrl Enter",
        },
        {
          list: [17, 90],
          msg: "ctrl Z",
        },{
          list: [16, 38],
          msg: "shift 上",
        },
        {
          list: [16, 40],
          msg: "shift 下",
        },
        {
          list: [13],
          msg: "Enter",
        },
      ],
    };
  },
mounted() {
    //开启监听
    window.addEventListener("keydown", this.KeyDown);
    window.addEventListener("keyup", this.keyup);
},

 beforeDestroy(){
    //手动销毁监听
    window.removeEventListener("keydown", this.KeyDown);
    window.removeEventListener("keyup", this.keyup);
  },

  methods: {
    //键盘抬起
    keyup(event) {
      const e = event || window.event || arguments.callee.caller.arguments[0];
      let key = e.keyCode; //键盘码值 keycode
      if (this.key.indexOf(key) !== -1) {
        this.key.splice(this.key.indexOf(key), 1);
        this.timer = null;
        clearTimeout(this.timer)
      }
    },
    //键盘按下
    KeyDown(event) {
      const e = event || window.event || arguments.callee.caller.arguments[0];
      let key = e.keyCode; //键盘码值 keycode
      console.log("key", key);
      if (!this.key.includes(key)) {
        this.key.push(key);
      }
      this.handleClick();
       //阻止浏览器默认事件
      event.preventDefault();
    },
    //按下的组合键是否是组合热键集中的热键
    handleClick() {
      this.dataList.forEach((item) => {
        if (this.checkValue(item.list.length, this.key, item.list)) {
          if (this.timer !== null) {
            return;
          }
          // 执行方法
          console.log(item.msg);
          //防止多次触发
          this.timer = setTimeout(() => {
            this.timer = null;
          }, 5000);
        }
      });
    },
    //匹配热键对应规则数据
    //num:需要匹配组合热键的个数
    //list:热键组合的集合
    //当前需要匹配的热键
    checkValue(num, list, list2) {
      for (let i = 0; i < num; i++) {
        if (list[i] !== list2[i]) {
          return false;
        }
        if(i+1==num){
          return true;
        }
      }
    },
  }

 建议:作为mixins使用

mixins完整代码:

export const myMixin = {
  data() {
    return {
      downKeyList: [],
      timer: null,
      dataList: [
        {
          list: [17, 187],
          msg: "ctrl +",
        },
        {
          list: [17, 107],
          msg: "ctrl +",
        },
        {
          list: [17, 83],
          msg: "ctrl S",
        },
        ...此处省略...
      ]
    };
  },
  methods: {
    // 键盘抬起
    keyup(event) {
      const e = event || window.event || arguments.callee.caller.arguments[0];
      let key = e.keyCode; //键盘码值 keycode
      if (this.downKeyList.indexOf(key) !== -1) {
        this.downKeyList.splice(this.downKeyList.indexOf(key), 1);
        this.timer = null;
        clearTimeout(this.timer);
      }
    }, // 键盘按下
    keyDown(event, func) {
      const e = event || window.event || arguments.callee.caller.arguments[0];
      let key = e.keyCode; //键盘码值 keycode // console.log('key', key)
      if (!this.downKeyList.includes(key)) {
        this.downKeyList.push(key);
      }
      event.preventDefault();
      this.downKeyHandle().then((res) => {
        // 符合热键组合,执行自定义函数
        // 执行方法
        func(res);
      });
    }, // 按下的组合键是否是组合热键集中的热键
    downKeyHandle() {
      return new Promise((resolve) => {
        this.dataList.forEach((item) => {
          if (this.checkValue(item.list.length, this.downKeyList, item.list)) {
            if (this.timer !== null) {
              return;
            } // 防止多次触发
            this.timer = setTimeout(() => {
              this.timer = null;
            }, 5000); 
            resolve(item.msg);
          }
        });
      });
    }, 
    // 匹配热键对应规则数据 
    // num:需要匹配组合热键的个数 
    // list:热键组合的集合 
    // list:当前需要匹配的热键
    checkValue(num, list, list2) {
      for (let i = 0; i < num; i++) {
        if (list[i] !== list2[i]) {
          return false;
        }
        if (i + 1 == num) {
          return true;
        }
      }
    },
  },
};

全局引入:

main.js

import {myMixin} from '@src/mixins/index'

Vue.mixin(myMixin)

在页面中使用:

mounted(){
    //addEventListener函数第二个参数,是操作函数,仅允许一个参数event
    //通过一个自定义的函数,去调用mymixin中的keyDown函数,同时传入一个自定义函数
    window.addEventListener('keydown', this.myFunction)
    window.addEventListener('keyup', this.keyup)
}

beforeDestroy(){
    //手动销毁
    window.removeEventListener('keydown', this.myFunction)
    window.removeEventListener('keyup', this.keyup)
}

methods:{
    myFunction(event) {
        this.keyDown(event, res => {
            //处理函数
             console.log(res)
        })
    }
}

 有些是不生效的,比如ctrl + W、ctrl + Y、ctrl + T、ctrl + N...

结束~

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue 自定义事件可以用于在组件之间传递数据。通过在父组件中使用`$emit`方法触发自定义事件,并在子组件中使用`$on`方法监听该事件,可以实现子组件向父组件传递数据。 在Vue中,可以使用`emits`选项来声明组件支持的自定义事件。在子组件中,使用`this.$emit(eventName, data)`方法触发自定义事件,并传递数据data。父组件可以通过监听这个自定义事件来接收子组件传递的数据。 另外,还可以通过在子组件中使用`v-on`或`@`语法来绑定父组件的自定义事件,从而实现子组件向父组件传递数据。在子组件中触发自定义事件后,父组件可以通过事件处理函数来接收传递的数据。 综上所述,Vue 自定义事件是一种很方便的方式来传递数据和实现组件之间的通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue自定义事件(详解)](https://download.csdn.net/download/weixin_38641339/13624910)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Vue自定义事件](https://blog.csdn.net/qq_48731430/article/details/121779200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Vue 自定义事件实现子组件数据向父组件传输](https://blog.csdn.net/weixin_41987908/article/details/127498540)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值