zoukankan      html  css  js  c++  java
  • 键盘多按键事件 移动的小方块

    // 键盘多按键事件
            // 在定义事件处理函数时,如果定义一个形参,JavaScript程序会自动向这个形参存储数据
            // 形参中存储的是事件对象的相关数据信息
            // 触发事件的对象,键盘事件,就是触发事件的按键,相关信息
            // 一般 事件对象 形参名称为 event 或者 e

            // 解决兼容问题:低版本IE,存储事件对象的语法,不是在事件处理函数中定义形参
            //             低版本IE存储事件对象方式 : window.event

            // 如果是 不兼容的语法,执行结果是 undefined

            // 说明: 最新高版本 谷歌火狐等浏览器也兼容 window.event 语法
            //       实际面试时,会问兼容写法 
            // 已经有定义的形参 e 可以直接对形参e进行赋值,不用再新定义变量
            // 如果 e 有存储内容,就赋值本身存储的内容
            // 如果 e 没有存储内容,结果是undefined,赋值 window.event 内容

            // 重要内容
            // key      按键名称 -- 会有按键相同重复
            // keyCode  键盘按键编码
            //          低版本的火狐浏览器,不支持keyCode
            //          使用的是 which,为了兼容低版本火狐浏览器,也要使用兼容语法
            //          var keyCode = e.keyCode || e.which
            //          高版本的火狐浏浏览器可以直接使用 e.keyCode

            // altKey  ctrlKey  shiftKey  判断是否按下 alt ctrl shift 键
            //    按下是 true   没有按下是 false
            // 可以通过这三个属性,判断多按键

            document.onkeydown = function(e){
                // 兼容事件对象
                e = e || window.event;
                // console.log(e);
                // 兼容获取按键编码
                var keyCode = e.keyCode || e.which;

                // 判断按键是否是 alt + ctrl + j (74) 
                if (e.altKey  && e.ctrlKey && keyCode === 74){
                    console.log('三个按键都按下')
                }

            }
     
     <style>
            * {
                margin: 0;
                padding: 0;
            }

            div {
                 100px;
                height: 100px;
                background: pink;
                position: fixed;
                top: 0;
                left: 0;
            }
        </style>
    </head>

    <body>
        <div></div>

        <script>
            var oDiv = document.querySelector('div');

            // 虽然要控制div,但是键盘按下事件,只能加载给document对象
            document.onkeydown = function (e) {
                // 需要先获取标签定位的原始数据
                // 数值的修改,是在原始数值基础上的修改
                var left;
                var top;

                // 通过兼容语法,获取标签的原始数据
                if (window.getComputedStyle) {
                    left = window.getComputedStyle(oDiv).left;
                    top = window.getComputedStyle(oDiv).top;
                } else {
                    left = oDiv.currentStyle.left;
                    top = oDiv.currentStyle.top;
                }

                // 执行结果是 left 和 top 有 px单位,要执行计算时,要去除px单位
                left = parseInt(left);
                top = parseInt(top);

                // 1,兼容事件对象
                e = e || window.event;

                // 2,兼容按键编码
                var keyCode = e.keyCode || e.which;

                // 3,判断按键  左37  上38  右39  下40 

                // if判断 和 switch判断 都可以 switch更好

                /*
                if(keyCode === 38){
                    // 如果上按键,给 top 数值 -= 一个固定数值
                    top -= 10;
                    // 将新的数据数值,赋值给标签对象,必须要有px单位
                    oDiv.style.top = top + 'px';
                }else if(keyCode === 40){
                    // 如果下按键,给 top 数值 += 一个固定数值
                    top += 10;
                    // 将新的数据数值,赋值给标签对象,必须要有px单位
                    oDiv.style.top = top + 'px';
                }else if(keyCode === 37){
                    // 如果左按键,给 left 数值 -= 一个固定数值
                    left -= 10;
                    // 将新的数据数值,赋值给标签对象,必须要有px单位
                    oDiv.style.left = left + 'px';
                }else if(keyCode === 39){
                    // 如果左按键,给 left 数值 == 一个固定数值
                    left += 10;
                    // 将新的数据数值,赋值给标签对象,必须要有px单位
                    oDiv.style.left = left + 'px';
                }
                */

                // 第二种if判断
                if (keyCode === 38 || keyCode === 40) {
                    // 上或者下
                    if (keyCode === 38) {
                        // 上
                        top -= 10;
                    } else {
                        // 下
                        top += 10;
                    }
                    oDiv.style.top = top + 'px';
                } else if (keyCode === 37 || keyCode === 39) {
                    // 左或者右
                    if (keyCode === 37) {
                        // 左
                        left -= 10;
                    } else {
                        // 有
                        left += 10;
                    }
                    oDiv.style.left = `${left}px`;
                }


            }


            // 总结
            // 1,思路:
            //     获取标签的原始数据信息 定位数值
            //     给document添加键盘按下事件
            //         获取按键keyCode,判断是哪个按键
            //         根据不同的按键,给定位属性修改属性值, +=   -=
            //         最后将新的属性值,赋值给标签,作为定位的数据
            // 2,问题:
            //     兼容处理:
            //         事件对象e兼容
            //         keyCode兼容
            //         获取标签执行样式兼容处理
            //     获取的样式,是否带有px单位
            //         带有单位的字符串,没有把办法直接执行 算术运算符
            //     赋值给标签时,注意要带上px单位
            //         所有的大小数据,赋值时,都要带有px单位
            //     数值要对应按键,千万别记错了
            //     左移 left-  右移left+   上移 top-   下移 top+
    右侧打赏一下 代码改变世界一块二块也是爱
  • 相关阅读:
    用 Timer Applet 做 GTD 料理
    Envy-便当的显卡驱动布置剧本
    DB2 9 运用开发(733 测验)认证指南,第 1 部分: 数据库工具与编程办法(1)
    Sabayon:经管 GNOME 用户的设置
    应用 KScope 阅读并编纂你的源代码
    Cheese-从摄像头捕捉照片和视频
    Kaffeine Player:功用富厚的媒体播放器
    SpeedCrunch:很酷的桌面较量争论器
    DB2 9 根蒂根基(730 测验)认证指南,第 7 部分: XQuery 简介(6)
    Conduit 0.3.2 颁布
  • 原文地址:https://www.cnblogs.com/ht955/p/14077171.html
Copyright © 2011-2022 走看看