Vue 键盘事件

来自姬鸿昌的知识库
跳到导航 跳到搜索

https://www.bilibili.com/video/BV1Zy4y1K7SH?p=16

  • vue 给一些按键起了别名,是小写开头的
  • 原本的按键名可以通过 event.key 得到,可能和 vue 起的别名一样,但是大写字母开头;对于 vue 没有取别名的按键,可以通过原本的按键名 event.key 绑定事件,但要注意的是:对于像 CapsLock 这样两个单词组成的按键在绑定的时候要使用 kebab-case (短横线命名),变成 caps-lock 才能成功绑定
  • 笔记本上 fn(function 功能键)是绑不了事件的
  • 像 tab 键,最好绑定 @keydown 使用,因为本身 tab 有切换控件、让当前控件失去焦点的功能,所以如果绑定 @keyup,等到 tab 键起来的时候事件的发生已经不在控件里了,所以就不能被原先的控件捕获到了
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>键盘事件</title>
    <!-- 引入 Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!--
    1. Vue 中常用的按键别名:
        回车 => enter
        删除 => delete(捕获“删除”和“退格”键;没有打开 numlock 时,按小键盘上的 del 也可以)
        退出 => esc
        空格 => space
        换行 => tab(特殊,必须配合 keydown 使用)
        上 => up
        下 => down
        左 => left
        右 => right

    2.Vue 未提供别名的按键,可以使用按键原始的 key 值去绑定,但注意要转为 kebab-case (短横线命名)

    3.系统修饰键(用法特殊):ctrl、alt、shift、meta(win 键,windows 徽标键,mac 里是 command 键)
        (1).配合 keyup 使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。
        (2).配合 keydown 使用:正常触发事件。

    4.也可以使用 keyCode 去指定具体的按键(不推荐,MDN 标注为已弃用)

    5.Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名
    -->
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2>欢迎来到{{name}}</h2>
        <input type="text" placeholder="按下回车提示输入" @keyup="showInfo">
         <!-- vue 中,.enter 可以代表回车 -->
        <!-- <input type="text" placeholder="按下回车提示输入" @keyup.enter="showInfo"><br> -->
        <!-- <input type="text" placeholder="按下回车提示输入" @keyup.delete="showInfo"><br> -->
    </div>
</body>
<script type="text/javascript">
    Vue.config.keyCodes.huiche = 13; //定义了一个别名按键

    new Vue({
        el:'#root',
        data:{
            name:'河北'
        },
        methods:{
            showInfo(e){
                // console.log(e.target.value);
                // console.log(e.keyCode);
                // 按下回车再提示
                // if (e.keyCode !== 13) return
                // console.log(e.target.value);
                console.log(e.key, e.keyCode);
            }
        }
    })
</script>
</html>

https://www.bilibili.com/video/BV1Zy4y1K7SH?p=17

事件总结

关于事件修饰符的小技巧(事件修饰符可以连续写:@click.stop.prevent="showInfo"),同时阻止冒泡和阻止默认事件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>关于事件修饰符的小技巧</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <style>
        .demo1{
            height: 50px;
            background-color: skyblue;
        }        
    </style>
</head>
<body>
    <div id="root">
        <div class="demo1" @click="showInfo">
            <!--先阻止冒泡、再阻止默认事件-->
            <a href="https://www.baidu.com/" @click.stop.prevent="showInfo">点我提示信息</a>
            <!--先阻止默认事件、再阻止冒泡-->
            <a href="https://www.baidu.com/" @click.prevent.stop="showInfo">点我提示信息</a>
        </div>
    </div>
</body>
<script type="text/javascript">
    new Vue({
        el:'#root',
        methods:{
            showInfo(e){
                console.log(e.target);
            },
        }
    })
</script>
</html>

先阻止冒泡或先阻止默认事件的区别,效果上是一样的

提出新需求

只有按下 ctrl + y 的时候才触发,按别的不触发:

在系统修饰键 ctrl 后面 .y,就是 ctrl 和 y 一起按的时候

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>关于事件修饰符的小技巧</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <style>
        .demo1{
            height: 50px;
            background-color: skyblue;
        }        
    </style>
</head>
<body>
    <div id="root">
        <input type="text" placeholder="同时按下 Ctrl+Y 输出" @keyup.ctrl.y="showInfo">
    </div>
</body>
<script type="text/javascript">
    new Vue({
        el:'#root',
        methods:{
            showInfo(e){
                console.log(e.target.value);
            },
        }
    })
</script>
</html>