关于keyCode的三个问题?

if (ev.keyCode == 13 && ev.ctrlKey) {//----------**问题1处:**
                var oLi = document.createElement('li');
                oLi.innerHTML = this.value;
                
                if ( oUl.children[0] ) {
                    oUl.insertBefore( oLi, oUl.children[0] );
                } else {
                    oUl.appendChild( oLi );
                }
                
            }

问题1:keycode只能显示一个值,ctrl键本身就是17,在按下enter(13)时又按下ctrl键,不就把13替换成17了吗?跟这样写ev.keyCode == 13 && ev.keyCode == 17有什么区别,ev.keyCode是不可能同时得到两个值的额?
问题2:要是网页上面有赛车游戏需要一直按住上键,然后用左右控制方向的话,那需要怎么办呢?
问题3:网页中不分删除下面的enter和小键盘中的enter吗?但是ps软件中的话这两个enter功能是有区别的额,网页不能实现类似ps的区分两个不同enter键的功能吗?

阅读 3.3k
2 个回答

首先,就算同时按下两个键,也会有一点时间误差而不是真的同时,一定是一先一后。所以按下 enter,再按下ctrl,会触发两个 keydown 事件,其 keyCode 分别是 13 和 17。

现在你可以按往 ctrl 不放,再按其它键,它们都会触发 keydown 等事件,而现在这些事件的 e.ctrlKey 就是 true 了。

keydown 事件之后,你可以设置一个标志变量,比如

let isUpPressing = false;
xxxx.on("keydown", e => {
    if (e.keyCode === 38) {
        isUpPressing = true;
    }
});

现在,只要你没改变这 isUpPressing 的值,它就始终下于 up 键按下的状态,虽然有可能 up 键已经放开了。当然在这个状态下你再按其它键,就可以用一堆变量来组合复合状态了。

刚才说了,up 放开了,但 isUpPressing 仍然是 true,所以我们需要处理这个问题,当然是用 keyup 事件来解决

xxxx.on("keyup", e => {
    if (e.keyCode === 38) {
        isUpPressing = false;
    }
});

小键盘的 09 对应的 keyCode 是 96 到 105。不过貌似没有区分小键盘上的功能键。

问题1:我刚刚试了下先按enter不放,再按ctrl与先按ctrl不放再按enter是一样的都能运行函数,说明if (ev.keyCode == 13 && ev.ctrlKey)的判断为true,但是正如您所说,两个按键是不可能同时按下的,所以ev.keyCode == 13 && ev.keyCode == 17两个不肯能同时满足,也就是永远为false才对额?

关于“现在你可以按往 ctrl 不放,再按其它键,它们都会触发 keydown 等事件,而现在这些事件的 e.ctrlKey 就是 true 了。”那ev.keyCode 里出现的值是(ctrl的17)吗,还是按的其他按键的值?我测试先按enter不放再按ctrl的话,keyCode 提示为17,ctrlKey提示为true,然后也运行了?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题