这三个事件有什么区别?通过谷歌搜索我发现了
当用户按下键时触发KeyDown事件。
用户释放密钥时会触发KeyUp事件。
当用户按下并释放密钥时,将触发KeyPress事件。 (onKeyDown后跟onKeyUp)
我理解前两个,但KeyPress与KeyUp不一样吗? (或者可以在没有按下(KeyDown)的情况下释放密钥(KeyUp)吗?)
这有点令人困惑,有人可以为我清除这个吗?
基本上,这些事件对不同的浏览器类型和版本的行为不同,我创建了一个小的jsBin测试,你可以检查控制台,找出这些事件对你的目标环境的行为,希望这个帮助。 change
KeyDown - 当你按下键时
KeyUp - 当您实际释放密钥时
KeyPress - 输入字符...如果按住某个键,KeyPress将多次触发,而其他键只会触发一次。
一些实际的事实可能有助于决定处理哪个事件(运行下面的脚本并专注于输入框):
紧迫:
$('input').on('keyup keydown keypress',e=>console.log(e.type, e.keyCode, e.which, e.key))
:
keydown 192 192逝
keydown 192 192''
按键180 180'
按键180 180'
keyup 192 192 Dead另外,非打字输入(例如,范围<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input/>
)仍将根据按下的键触发所有键盘,键控和按键事件。
KeyPress
,KeyUp
和KeyDown
分别类似于:Click
,MouseUp,
和MouseDown
。
Down
首先发生Press
发生在第二位(输入文字时)Up
最后发生(文本输入完成时)。keydown
keypress
textInput
keyup
下面是一个片段,您可以在事件被触发时自己查看:
window.addEventListener("keyup", log);
window.addEventListener("keypress", log);
window.addEventListener("keydown", log);
function log(event){
console.log( event.type );
}
密钥关闭时qazxsw poi被解雇(如在快捷方式中;例如,在qazxsw poi中,qazxsw poi被保持'向下'。
释放键时触发onkeydown
(包括修饰符/ etc键)
Ctrl+A
作为Ctrl
和onkeyup
的组合被解雇,或者取决于键盘重复(当onkeypress
没有被解雇时)。 (这种重复行为是我没有测试的。如果你做测试,添加评论!)
输入一些文本时会触发onkeydown
(仅限webkit)(例如,onkeyup
将输入大写'A',但onkeyup
将选择文本而不输入任何文本输入。在这种情况下,所有其他事件都会被触发)
这里的大多数答案都更多地关注理论而不是实际问题,并且textInput
和Shift+A
之间存在一些重大差异,因为它与输入字段值有关,至少在Firefox中是如此(在43中测试过)。
如果用户将Ctrl+A
键入空输入元素:
keyup
处理程序内的空字符串(旧值)keypress
处理程序中的1
(新值)。如果您正在做一些依赖于在输入之后知道新值而不是当前值(如内联验证或自动选项卡)的内容,这一点非常重要。
场景:
keypress
键入输入元素。1
。keyup
。当12345
事件在输入字母12345
后触发时,文本框现在只包含字母A
。
但:
keypress
。A
所以似乎浏览器(Firefox 43)擦除了用户的选择,然后触发A
事件,然后更新字段内容,然后触发12345
。
似乎onkeypress和onkeydown做同样的事情(在上面已经提到的快捷键的小差异内)。
你可以试试这个:
5
并且您将看到按下按键时触发事件onkeypress和onkeydown,而不是按下按键时触发事件。
不同之处在于事件不是一次触发而是多次触发(只要按住按键)。请注意并相应地处理它们。
首先,他们有不同的含义:他们开火:
其次,一些键会触发其中一些事件而不会触发其他事件。例如,
此外,您应该记住,keypress
(和keyup
)通常具有相同的KeyDown和KeyUp值,但KeyPress的值不同。试试我创造的<textarea type="text" onkeypress="this.value=this.value + 'onkeypress '"></textarea>
<textarea type="text" onkeydown="this.value=this.value + 'onkeydown '" ></textarea>
<textarea type="text" onkeyup="this.value=this.value + 'onkeyup '" ></textarea>
。顺便说一句,我注意到了很多怪癖:在Chrome中,当我按下ctrl + a并且event.keyCode
/ event.which
为空时,KeyPress的火焰与playground(和input
)等于textarea
! (当输入不为空时,它根本不会触发)。
最后,有一些语用学:
event.keyCode
,KeyPress和KeyDown都会多次开火(Chrome 71),如果我需要多次触发的事件和KeyUp用于单键释放,我会使用KeyDown。event.which
s和1
s的行为有所不同(主要是由于失去焦点)我在我的项目中使用了所有3个,但不幸的是可能忘记了一些语用学。 (需要注意的是:还有textarea
和input
事件)
Jan Wolter的这个textarea
是我遇到过的最好的作品,你可以找到存档的副本input
如果链接已经死了。
它解释了所有浏览器关键事件,
按下键时会发生keydown事件,紧接着是按下按键事件。然后,在释放密钥时生成keyup事件。
要理解keydown和keypress之间的区别,区分字符和键是很有用的。键是计算机键盘上的物理按钮。字符是通过按下按钮键入的符号。在美国键盘上,在按住Shift键的同时按下4键通常会产生“美元符号”字符。世界上每个键盘都不一定如此。理论上,keydown和keyup事件表示按下或释放的键,而keypress事件表示键入的字符。实际上,这并不总是它的实现方式。
有一段时间,一些浏览器在按键后立即触发了另一个名为textInput的事件。早期版本的DOM 3标准旨在将其作为keypress事件的替代品,但整个概念后来被撤销。 Webkit在版本525和533之间支持这一点,我告诉IE支持它,但我从未检测到它,可能是因为Webkit要求它被称为textInput而IE称之为textinput。
还有一个名为input的事件,由所有浏览器支持,只有在对textarea或输入字段进行更改后才会触发。通常按键会触发,然后键入的字符将出现在文本区域中,然后输入将触发。输入事件实际上并不提供有关键入的键的任何信息 - 您必须检查文本框以找出更改的内容 - 因此我们并不认为它是一个关键事件,并且不会在此处记录它。虽然它最初只是为textareas和输入框定义的,但我相信还有一些动机可以将其概括为触发其他类型的对象。
onkeypress事件适用于除所有浏览器中的ALT,CTRL,SHIFT,ESC之外的所有键,其中onkeydown事件适用于所有键。意味着onkeydown事件捕获所有键。
只是想分享好奇心:
当使用onkeydown事件激活JS方法时,该事件的charcode与onkeypress的charcode不同!
例如,当使用onkeypress时,小键盘键将返回与字母键上方的数字键相同的字符代码,但不是在使用onkeydown时!
花了我几秒钟来弄清楚为什么我的脚本在使用onkeydown时检查了某些charcodes失败了!
但是:Kua zxsw指出
是的。我知道方法的定义是不同的..但是非常令人困惑的是,在两种方法中,使用event.keyCode检索事件的结果但是它们不返回相同的值..不是很声明性实施。