onKeyPress与。onKeyUp和onKeyDown


329

这三个事件之间有什么区别?谷歌搜索后发现:

  • onKeyDown当用户按下一个键触发事件。
  • onKeyUp当用户释放一个键触发事件。
  • onKeyPress当用户按下并释放一个键(onKeyDown后跟onKeyUp)时,将触发该事件。

我了解前两个,但onKeyPressonKeyUp?是否可以在onKeyUp不按()的情况下释放键(onKeyDown)?

这有点令人困惑,有人可以帮我解决这个问题吗?


3
我发现如果按住TAB键,它将连续在所有字段中循环,并且仅触发“ onkeydown”。
nu Everest,2015年

23
keypress事件表示正在键入的可用于输入的字符,例如'a','D','£','©'等。另一方面,keydown和keyup事件表示正在键入的任何键,包括退格键,制表符,上,下,home,end等。
skcin7 '16

2
“(或者是否可以释放一个键(KeyUp)而无需按下(KeyDown)键?)”-是的。例如,Tab键:keyup事件可能无法由与keydown相同的元素捕获。
自证会

Answers:


191

在此处查看此答案中最初使用的存档链接

从该链接:

理论上,onKeyDownonKeyUp事件代表按下或释放的键,而onKeyPress事件代表正在键入的字符。该理论的实现并非在所有浏览器中都相同。


18
基于@Falk的帖子放在一起的jsfiddle来演示特质同步
fordareh

我看不到链接的页面,但是如果您打算使用此字符进行任何形式的验证,那么关于“正在键入字符”这一点很重要。用户删除字符时,不会触发keypress事件,因此不会触发您的验证。
Tony Merryfield

@Tony Merryfield-链接对我来说很好,我再次检查了一下。
dcp

1
@dcp-是的,足够使我走上正确的道路。我只是添加了我的评论,以强调这一点,即仅在键入字符而不是任何按键时才触发事件-您得到了我的好评;)
Tony Merryfield,2016年

1
同样,在长按某个键时,KeyDown事件会一直触发,直到释放键为止,在这种情况下,KeyUp仅触发一次;)
Bernoulli IT

195

KeyPressKeyUp并且KeyDown类似于分别为:ClickMouseUp,MouseDown

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

webkit例外,其中有一个额外的事件:

keydown
keypress
textInput     
keyup

以下是您可以在事件触发时亲自查看的摘要:

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

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


1
那么,KeyPress只是一个额外的事件,是黑白键降和TextInput吗?开发人员通常如何使用(KeyPress)?
Instantsetsuna

78
+1最佳答案- 首先发生* Down,之后发生* Press(输入文本时),然后发生* Up最后(文本输入完成时)。
Scott Pelak 2013年

2
-1,因为在代码段中进行了一些小实验就与您对“点击”事件的类推相矛盾。“ click”事件与“ mouseup”(释放鼠标按钮)同时触发,但是“ keypress”事件与“ keydown”(首次按下键)同时触发。
Mark Amery

2
@Robusto实际上,keypresskeydown事件实际上是被分配了相同的.timeStamp值,该值精确到5微秒的间隔,但这并不是我的意思。我的意思是该click事件在您释放鼠标按钮之前不会触发,因此说这keypress是键盘版本,click使其听起来好像keypress在您释放键之前不会触发。实际上,情况并非如此:按下键时会触发,就像这样keydown。所以keypress实际上根本不类似于click
Mark Amery

2
@Robusto “您如何解释总是在'keydown'之后记录'keypress'的方法” -简单:同一用户操作(按下一个键)会立即触发两个处理程序被推入事件队列,但顺序固定。“您只想为辩论而辩论” -嗯?你的答案的核心论点是keypresskeyupkeydown类似于clickmouseupmousedown。对我而言,对此的自然解释是keypresskeyupclick和和一样mouseup)同时触发。什么没有你的意思是,如果不是呢?
Mark Amery

23

这里的大多数答案更多地侧重于理论而非实际问题,并且至少在Firefox中(在43中进行了测试),它们之间keyup以及keypress与输入字段值之间存在一些较大差异。

如果用户键入1一个空的输入元素:

  1. 输入元素的值将是keypress处理程序中的空字符串(旧值)

  2. 输入元素的值将是处理程序中的1(新值)keyup

如果您要执行的操作依赖于输入后知道新值而不是当前值(例如,内联验证或自动制表),那么这至关重要。

场景:

  1. 用户键入12345输入元素。
  2. 用户选择文本12345
  3. 用户键入字母A

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

但:

  1. Field.val()是12345
  2. $ Field.val()。length为 5
  3. 用户选择是一个空字符串(防止您通过覆盖选择来确定删除了什么)。

因此,似乎浏览器(Firefox 43)会删除用户的选择,然后触发keypress事件,然后更新字段内容,然后触发keyup


16

onkeydown按下键时会触发(例如快捷方式;例如,在中Ctrl+ACtrl按住。

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

onkeypress被烧制的组合onkeydownonkeyup,或根据键盘重复(当onkeyup不触发)。(这种重复行为是我尚未测试过的。如果您进行测试,请添加评论!)

textInput(仅适用于webkit)在输入某些文本时触发(例如,Shift+A将输入大写字母“ A”,但Ctrl+A将选择文本而不输入任何文本输入。在这种情况下,将触发所有其他事件)


1
只需确认,实际上,在按住该键时会重复调用“ onkeypress”,并且会发生“键盘重复”。但是,“ onkeydown”也是如此!(给出的名称出乎意料)
Venryx

11

首先,它们具有不同的含义:它们触发:

  • KeyDown – 按下按键
  • KeyUp – 释放按钮时以及更新输入/文本区域的值之后(其中只有一个)
  • KeyPress –在这两者之间,实际上并不表示按键已被按下和释放(请参见下文)。

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

  • 按键响应忽略delete,箭头,PgUp/ PgDnhome/ endctrlaltshift等等而KeyDown和KEYUP不(见关于细节esc下文);
  • 当您在Windows中通过alt+ 切换窗口时tab,只有KeyDown alt会触发,因为窗口切换发生在任何其他事件之前(而tab我认为,至少在Chrome 71中,KeyDown 被系统阻止)。

另外,您应该记住,event.keyCode(和event.which)通常对KeyDown和KeyUp具有相同的值,但对于KeyPress具有不同的值。尝试我创建的游乐场。顺便说一句,我注意到了一个奇怪的问题:在Chrome中,当我按ctrl+ ainput/ textarea为空时,对于KeyPress而言,event.keyCode(和event.which)等于1!(当输入不为空时,它根本不会触发)。

最后,有一些语用学

  • 为了处理箭头,您可能需要使用onKeyDown:如果用户按住,则KeyDown会触发多次(而当他们释放按钮时,KeyUp只会触发一次)。同样,在某些情况下,您可以轻松地阻止KeyDown的传播,但不能(或不能那么容易)阻止KeyUp的传播(例如,如果要在Enter上提交而不向文本字段添加换行符)。
  • 出乎意料的是,当您按住某个键(例如)时textarea,KeyPress和KeyDown都会多次触发(Chrome 71),如果我需要多次触发的事件和一个按键释放的KeyUp,我会使用KeyDown。
  • 当您必须对游戏的动作提供更好的响应时,KeyDown通常更适合游戏。
  • esc通常是通过KeyDown处理的:KeyPress不会触发,并且KeyUp 在不同的浏览器中对inputs和textareas的行为有所不同(主要是由于失去焦点)
  • 如果您想根据内容调整文本区域的高度,则可能不使用onKeyDown而是使用onKeyPress(好的,在这种情况下,最好使用onChange)。

我已经在项目中使用了全部3个,但是不幸的是,可能忘记了一些实用功能。(要注意:还有inputchange事件)


我没有考虑过将新行添加到字段内容的keyup,但这实际上很重要。
FKEinternet

10

文章由Jan沃尔特是我碰上了最好的一块,你可以找到归档副本这里如果链接已经死了。

它很好地解释了所有浏览器按键事件,

KEYDOWN事件发生时,按下该键,紧接着的按键事件。然后,释放键时会生成keyup事件。

要理解的区别KEYDOWN按键,这是区分有用字符。一个关键是计算机的键盘上的物理按键。甲字符是通过按压按钮类型的符号。在美国键盘上,4在按住键的同时按下Shift键通常会产生“美元符号”字符。世界上的每个键盘不一定都是这种情况。从理论上讲,keydownkeyup事件表示按下或释放的,而keypress事件表示正在键入的字符。实际上,这并不总是实现方式。

有一段时间,一些浏览器在按键后立即触发了另一个事件,称为textInput。DOM 3标准的早期版本打算以此来代替按键事件,但是整个概念后来被撤销了。Webkit在525和533版本之间支持此功能,但有人告诉我IE支持它,但我从未检测到,可能是因为Webkit要求将其称为textInput,而IE称为textinput

还有一个名为input的事件,受所有浏览器支持,该事件在对textarea或input字段进行更改后立即触发。通常,按键将触发,然后键入的字符将出现在文本区域中,然后输入将触发。该输入事件实际上并不给什么键被输入的任何信息-你不得不检查文本框弄明白发生了什么变化-所以我们真的不认为这是一个关键事件,并不能真正在这里记录它。尽管它最初仅是为文本区域和输入框定义的,但我相信在将其推广到其他类型的对象上也有一些发展。


最佳答案,那么如何从按键中获得美元符号呢?
bluejayke

10

似乎onkeypress和onkeydown可以实现相同的功能(只是上面已经提到的快捷键的细微差别)。

您可以尝试以下方法:

<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>

而且您会看到onkeypress和onkeydown事件都是在按下键时触发的,而不是在按下键时触发的。

区别在于事件不会被触发一次,而是会被触发多次(只要按住该键即可)。请注意这一点并进行相应处理。


Ctrl,Shift,CapsLock,Backspace和其他未键入内容的键不会导致keypress事件,但它们始终会触发keydown
CPHPython

8

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


按键也忽略删除,箭头,
起始

4

只想分享好奇心:

当使用onkeydown事件激活JS方法时,该事件的字符代码与您通过onkeypress获得的字符不同!

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

花了我几秒钟的时间来弄清楚为什么使用onkeydown时检查某些字符代码的脚本失败了!

演示:https : //www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK

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


看来,一切的数字字符(同0123456789
Mrigank Pawagi

您是否注意到keyDown给出了键盘上的KEY,而keyPress给出了我们刚刚键入(或单击)的确切字符
Mrigank Pawagi

2

基本上,这些事件在不同的浏览器类型和版本上的行为有所不同,我创建了一个jsBin测试,您可以检查控制台以了解这些事件在目标环境中的行为,希望能有所帮助。http://jsbin.com/zipivadu/10/edit


1

更新的答案:

按键

  • 按住键时触发多次。
  • 触发中继键。

按键

  • 按住键时触发多次。
  • 难道火元密钥。

按键

  • 释放键时最后触发一次
  • 触发中继键。

这是双方的行为addEventListenerjQuery

https://jsbin.com/vebaholamu/1/edit?js,控制台,输出 <-尝试示例

显示按住SSS的示例

(答案已编辑,答案,截图和示例正确无误)


除了多次触发的keydown之外
-bluejayke

-1,因为至少在Chrome中对此至少有一个细节是错误的;正如@bluejayke所说,当您按住某个键时,KeyDown也会反复触发。
Mark Amery

是的,你们是对的,对不起我的错;答案已编辑。
Quang Van

0

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

$('input').on('keyup keydown keypress',e=>console.log(e.type, e.keyCode, e.which, e.key))
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input/>

紧迫:

  • 非插入/打字密钥(例如ShiftCtrl)不会触发keypress。按下Ctrl并释放它:

    按键17 17控制

    键盘17 17控制

  • 从适用的字符转换为其他字符的键盘按键可能会导致死亡复制的“钥匙”(例如~´上)keydown。按下´并释放它以显示双倍´´

    按下192192死

    键盘192192´´

    按键180180´

    按键180180´

    键盘192192死

此外,非键入输入(例如range <input type="range">)仍会根据按下的键触发所有的keyup,keydown和keypress事件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.