onKeyPress Vs. onKeyUp和onKeyDown

问题描述 投票:267回答:11

这三个事件有什么区别?通过谷歌搜索我发现了

当用户按下键时触发KeyDown事件。

用户释放密钥时会触发KeyUp事件。

当用户按下并释放密钥时,将触发KeyPress事件。 (onKeyDown后跟onKeyUp)

我理解前两个,但KeyPress与KeyUp不一样吗? (或者可以在没有按下(KeyDown)的情况下释放密钥(KeyUp)吗?)

这有点令人困惑,有人可以为我清除这个吗?

javascript dom javascript-events
11个回答
167
投票

点击此处查看本答案中最初使用的存档link

从该链接:

理论上,keydown和keyup事件表示按下或释放的键,而keypress事件表示键入的字符。在所有浏览器中,该理论的实现并不相同。


2
投票

基本上,这些事件对不同的浏览器类型和版本的行为不同,我创建了一个小的jsBin测试,你可以检查控制台,找出这些事件对你的目标环境的行为,希望这个帮助。 change


0
投票

KeyDown - 当你按下键时

KeyUp - 当您实际释放密钥时

KeyPress - 输入字符...如果按住某个键,KeyPress将多次触发,而其他键只会触发一次。


0
投票

一些实际的事实可能有助于决定处理哪个事件(运行下面的脚本并专注于输入框):

紧迫:

  • 非插入/输入键(例如Shift,Ctrl)不会触发https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK。按Ctrl键并释放它: keydown 17 17控制 keyup 17 17控制
  • 键盘中的键将字符转换应用于其他字符可能导致在http://jsbin.com/zipivadu/10/edit上出现死亡和重复的“键”(例如〜,')。按'并释放它以显示双$('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/>)仍将根据按下的键触发所有键盘,键控和按键事件。


161
投票

KeyPressKeyUpKeyDown分别类似于:ClickMouseUp,MouseDown

  1. Down首先发生
  2. Press发生在第二位(输入文字时)
  3. Up最后发生(文本输入完成时)。

The exception is webkit, which has an extra event in there:

keydown
keypress
textInput     
keyup

下面是一个片段,您可以在事件被触发时自己查看:

window.addEventListener("keyup", log);
window.addEventListener("keypress", log);
window.addEventListener("keydown", log);

function log(event){
  console.log( event.type );
}

14
投票

密钥关闭时qazxsw poi被解雇(如在快捷方式中;例如,在qazxsw poi中,qazxsw poi被保持'向下'。

释放键时触发onkeydown(包括修饰符/ etc键)

Ctrl+A作为Ctrlonkeyup的组合被解雇,或者取决于键盘重复(当onkeypress没有被解雇时)。 (这种重复行为是我没有测试的。如果你做测试,添加评论!)

输入一些文本时会触发onkeydown(仅限webkit)(例如,onkeyup将输入大写'A',但onkeyup将选择文本而不输入任何文本输入。在这种情况下,所有其他事件都会被触发)


14
投票

这里的大多数答案都更多地关注理论而不是实际问题,并且textInputShift+A之间存在一些重大差异,因为它与输入字段值有关,至少在Firefox中是如此(在43中测试过)。

如果用户将Ctrl+A键入空输入元素:

  1. input元素的值将是keyup处理程序内的空字符串(旧值)
  2. 输入元素的值将是keypress处理程序中的1(新值)。

如果您正在做一些依赖于在输入之后知道新值而不是当前值(如内联验证或自动选项卡)的内容,这一点非常重要。

场景:

  1. 用户将keypress键入输入元素。
  2. 用户选择文本1
  3. 用户键入字母keyup

12345事件在输入字母12345后触发时,文本框现在只包含字母A

但:

  1. Field.val()是keypress
  2. $ Field.val()。长度是A
  3. 用户选择是一个空字符串(阻止您通过覆盖选择来确定删除的内容)。

所以似乎浏览器(Firefox 43)擦除了用户的选择,然后触发A事件,然后更新字段内容,然后触发12345


10
投票

似乎onkeypress和onkeydown做同样的事情(在上面已经提到的快捷键的小差异内)。

你可以试试这个:

5

并且您将看到按下按键时触发事件onkeypress和onkeydown,而不是按下按键时触发事件。

不同之处在于事件不是一次触发而是多次触发(只要按住按键)。请注意并相应地处理它们。


10
投票

首先,他们有不同的含义:他们开火:

  • KeyDown - 按下某个键时
  • KeyUp - 释放按钮时,更新input / textarea的值后(其中唯一一个)
  • KeyPress - 介于这些之间并且实际上并不意味着密钥被推送和释放(见下文)。

其次,一些键会触发其中一些事件而不会触发其他事件。例如,

  • KeyPress忽略删除,箭头,PgUp / PgDn,home / end,ctrl,alt,shift等,而KeyDown和KeyUp则没有(请参阅下面有关esc的详细信息);
  • 当你在Windows中通过alt + tab切换窗口时,只有用于alt的KeyDown触发,因为窗口切换发生在任何其他事件之前(并且系统阻止了Tab的KeyDown,我想,至少在Chrome 71中)。

此外,您应该记住,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! (当输入不为空时,它根本不会触发)。

最后,有一些语用学:

  • 对于处理箭头,你可能需要使用onKeyDown:如果用户持有↓,KeyDown会多次触发(而KeyUp在释放按钮时仅触发一次)。此外,在某些情况下,您可以轻松地阻止KeyDown的传播,但不能(或不能轻易地)阻止KeyUp的传播(例如,如果您想在输入时提交而不向文本字段添加换行符)。
  • 令人惊讶的是,当你拿着一把钥匙,比如在event.keyCode,KeyPress和KeyDown都会多次开火(Chrome 71),如果我需要多次触发的事件和KeyUp用于单键释放,我会使用KeyDown。
  • 当你必须为他们的行为提供更好的响应时,KeyDown通常更适合游戏。
  • esc通常通过KeyDown处理:KeyPress不会触发,而且KeyUp在不同的浏览器中对event.whichs和1s的行为有所不同(主要是由于失去焦点)
  • 如果你想调整文本区域的高度到内容,你可能不会使用onKeyDown而是onKeyPress(PS好吧,在这种情况下使用onChange实际上更好)。

我在我的项目中使用了所有3个,但不幸的是可能忘记了一些语用学。 (需要注意的是:还有textareainput事件)


9
投票

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和输入框定义的,但我相信还有一些动机可以将其概括为触发其他类型的对象。


8
投票

onkeypress事件适用于除所有浏览器中的ALT,CTRL,SHIFT,ESC之外的所有键,其中onkeydown事件适用于所有键。意味着onkeydown事件捕获所有键。


3
投票

只是想分享好奇心:

当使用onkeydown事件激活JS方法时,该事件的charcode与onkeypress的charcode不同!

例如,当使用onkeypress时,小键盘键将返回与字母键上方的数字键相同的字符代码,但不是在使用onkeydown时!

花了我几秒钟来弄清楚为什么我的脚本在使用onkeydown时检查了某些charcodes失败了!

但是:Kua zxsw指出

是的。我知道方法的定义是不同的..但是非常令人困惑的是,在两种方法中,使用event.keyCode检索事件的结果但是它们不返回相同的值..不是很声明性实施。

© www.soinside.com 2019 - 2024. All rights reserved.