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



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




我理解前两个,但是onKeyPressonKeyUp不同吗?

有点困惑,有人可以帮我清除一下吗?

评论

我发现,如果按住TAB键不放,它将连续循环遍历所有字段,并且仅触发“ onkeydown”。

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

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

#1 楼

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

从该链接开始:


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


评论


基于@Falk的帖子放在一起的jsfiddle来演示特质同步(使用jquery):jsfiddle.net/zG9MF/2

–fordareh
13年10月30日在18:53

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

–托尼·梅里菲尔德
16年1月19日在12:17

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

– dcp
16年1月19日在23:44

@dcp-是的,足以给我正确的提示。我只是添加了我的评论,以强调这一点,即该事件仅在键入字符而不是任何按键时才触发-您得到了我的好评;)

–托尼·梅里菲尔德
16年1月21日在11:23

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

–伯努利IT
18年4月26日在13:56

#2 楼

KeyPressKeyUpKeyDown分别类似于:ClickMouseUp,MouseDown


Down首先出现

Press第二出现(输入文本时)

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 );
} 




评论


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

–instantsetsuna
2010年8月3日13:56

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

–斯科特·佩拉克(Scott Pelak)
13年20月20日上午9:50

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

–马克·阿默里(Mark Amery)
19年6月25日在9:50

@Robusto实际上,按键和按键事件实际上是分配了相同的.timeStamp值,该值精确到5微秒的间隔,但这并不是我真正的意思。我的观点是,单击事件在您释放鼠标按钮之前不会触发,因此说keypress是click的键盘版本,这听起来像keypress在释放键之前同样不会触发。实际上,情况并非如此:按下键时会触发,就像按下键时一样。因此,按键实际上根本不类似于单击。

–马克·阿默里(Mark Amery)
19年6月25日在12:33

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

–马克·阿默里(Mark Amery)
19年6月25日在16:25

#3 楼

这里的大多数答案更多地侧重于理论而不是实际问题,并且keyupkeypress之间存在一些很大的差异,因为它涉及输入字段值,至少在Firefox中(在43中进行了测试)。

如果用户在空的输入元素中输入1


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

如果您要做的事情依赖于输入后知道新值而不是当前值(例如内联验证或自动制表符。

场景:


用户将12345键入输入元素。
用户选择文本12345
用户键入字母A

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

但是:


Field.val()是12345
$ Field.val()。length是5

用户选择是一个空字符串(防止您通过覆盖选择来确定删除了什么内容)。

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

#4 楼

按下键时会触发onkeydown(例如快捷方式;例如,在Ctrl+A中,将Ctrl保持为“按下”状态。

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

onkeypress是作为onkeydownonkeyup的组合触发的,或者取决于键盘重复次数(当未触发onkeyup时)(这种重复行为是我尚未测试过的。如果您要进行测试,添加评论!)

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

评论


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

– Venryx
17-3-26在17:59



#5 楼

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


KeyDown –按下键时

KeyUp –释放按钮时,以及Input / textarea的值被更新(其中只有一个)
KeyPress –在这两者之间,并不表示实际上已按下并释放了一个键(请参见下文)。

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


KeyPress会忽略删除,箭头,PgUp / PgDn,home / end,ctrl,alt,shift等,而KeyDown和KeyUp则不会(请参见下面有关esc的详细信息);
当您在Windows中通过alt + tab切换窗口时,只有alt才会触发altdown,因为窗口切换发生在任何其他事件之前(我想,至少在Chrome 71中,系统阻止了tab的keydown)。 />
此外,您还应该记住,event.keyCode(和event.which)的KeyDown和KeyUp值通常相同,而KeyPress的值不同。尝试我创建的游乐场。顺便说一句,我注意到了一个奇怪的问题:在Chrome中,当我按ctrl + a且input / 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在不同浏览器中对inputtextarea的行为有所不同(主要是由于失去焦点)
如果您想将文本区域的高度调整为内容,您可能不会使用onKeyDown,而是使用onKeyPress(PS,在这种情况下,实际上最好使用onChange)。

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

评论


我没想到要在字段内容中添加换行符,但是这实际上很重要。

– FKEinternet
18/12/12在9:35

#6 楼

Jan Wolter的这篇文章是我遇到的最好的文章,如果链接失效,您可以在这里找到存档的副本。
它很好地解释了所有浏览器的按键事件,

keydown事件按下键时发生,紧随其后的是按键事件。松开键时会生成keyup事件。
要了解keydown和keypress之间的区别,区分字符和键很有用。按键是计算机键盘上的物理按钮。字符是通过按按钮键入的符号。在美国键盘上,按住Shift键的同时按4键通常会产生一个“美元符号”字符。世界上的每个键盘不一定都是这种情况。从理论上讲,keydown和keyup事件表示正在按下或释放的键,而keypress事件则表示正在键入的字符。实际上,这并不总是实现方式。
有一段时间,一些浏览器在按键后立即触发了另一个事件,称为textInput。 DOM 3标准的早期版本打算以此代替keypress事件,但是整个概念后来被撤销。 Webkit在525和533版本之间支持此功能,但有人告诉我IE支持它,但我从未检测到,可能是因为Webkit要求将其称为textInput,而IE却将其称为textinput。
还有一个称为输入的事件,受所有浏览器支持,该事件在对文本区域或输入字段进行更改后立即触发。通常,按键将触发,然后键入的字符将出现在文本区域中,然后输入将触发。输入事件实际上并没有提供有关键入键的任何信息-您必须检查文本框以了解更改的内容-因此我们并不真正将其视为键事件,也没有在此处进行实际记录。尽管它最初仅是为文本区域和输入框定义的,但我相信在将其推广到其他类型的对象上也有一些发展。


评论


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

– bluejayke
19年6月24日在19:10

#7 楼

似乎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和其他未键入内容的键不会导致按键事件,但它们始终会触发按下键。

– CPHPython
19/09/13在17:20

#8 楼

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

评论


按键也忽略删除,箭头,起始/结束,PgUp / PgDn,有关详细信息,请参见我的答案(您可能也想更新答案)

– YakovL
19年6月24日在7:44

#9 楼

更新的答案:

KeyDown


按住键时多次触发。
触发元键。

KeyPress


按住键时多次触发。
不触发元键。

KeyUp


释放密钥时最后触发一次。
触发元密钥。

这是addEventListenerjQuery的行为。

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



(答案已正确编辑,带有截图和示例)

评论


除了会多次触发的keydown

– bluejayke
19年6月24日在19:10

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

–马克·阿默里(Mark Amery)
19年6月25日在9:45

是的,你们是对的,为我的错误感到抱歉;答案已编辑。

– Quan Van
19/12/11在14:15

按键会为每个添加的角色触发,而按键会不断触发(根据重复速度,在相同的时间内重复编织更多次)

–加布里埃尔·彼得森(Gabriel Petersson)
12月11日下午13:51

#10 楼

只是想分享一个好奇心:

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

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

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

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

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

评论


似乎数字字符(0123456789)相同

– Mrigank Pawagi
18 Mar 27 '18 at 16:40

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

– Mrigank Pawagi
18 Mar 27 '18在16:41

#11 楼

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

#12 楼

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




 $('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/> 





按下:




非插入/键入键(例如Shift,Ctrl)不会触发keypress。按下Ctrl并释放它:


keydown 17 17 Control

keyup 17 17 Control



将字符转换应用到其他字符的键盘上的键可能会导致在keydown上出现死键和重复的“键”(例如〜,´)。按下并释放它以显示双´´


按下192 192死键

按下192 192´´

keypress 180 180´

keypress 180 180´

keyup 192 192 Dead




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