javascript - js中的onkeydown事件为什么会重复触发?

查看:453
本文介绍了javascript - js中的onkeydown事件为什么会重复触发?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

document.onkeydown=function(event){
    console.log(event);
}

1、为什么按下一个键盘按键,这个事件会一直被触发。这不符合常理。浏览器为什么要这么做?

2、我知道可以用一个状态变量来实现过滤重复触发。但是,除了
onkeydown + onkeyup + var is_down + setInterval
,是否有更优雅的方式来实现监听某键按下中的状态?要实现的效果是按下方向键,元素开始移动,松开方向键,元素停止移动

解决方案

我来回个几句,看能不能给点灵感。

第1个问题是为什么这个onkeydown是长按住会一直触发。

这是W3C标准的规范,原始设计就是这样。keydown本身是用来获取所有的键盘事件,包含ctrl、alt等等都有,不只包含一般的输入键(像123abc)之外,所有在键盘上的键都有对应值,也就是它的回传值是有个代码。会这样作的原因当然是在输入时有可能会有复合键的情况,例如ctrl+s这样的键盘输入。

最常被问到的是keydown与keypress的差异,onkeypress的设计较为不同,它是用来作键盘上的输入用的,只有一般的文字键可以使用,例如上下左右键它就没反应。虽然它keydown一样会获取得到ascii的keycode码,但keydown获取到的是英文大小写无异,而keypress获取到的是英文大小写有差异的,例如下面的例子:

keydown() a = 65, A = 65 (大小写无异)
keypresss() a= 97, A = 65 (大小写有异)

另一个明显的差异在于长按,也就一直按住某个键,基本上keydown的长按就会像你说的一直触发,以文字框来说就是不断输入,而keypress并不会。但也有特例,也就是Enter这个键,以及在一个文字框中长按空白键,也会让keypress一直触发,细部再研究了。keypress不适合于使用,因为它无法获取到上下左右键。所以仍然要使用keydown,而且是要考虑到长按的情况。

第2个问题是要用方向键来长按住作移动。

这大概是作互动最基本的问题,我想你应该已有试过onkeydown + onkeyup + var is_down + setInterval的方式,你说的方式是最普遍的解决方式,也可能有使用jQuery的animate函式库,来让动画更顺畅。网上有很多范例。

并没有其他更优雅的方式来作这件事,而是在浏览器上只能用keydown+keyup来监听长按的事件,这固定的套路。更多的解决方式只是在让如何动作动得更顺畅而已。

楼上的范例就是很好的一个例子。

这篇关于javascript - js中的onkeydown事件为什么会重复触发?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆