当用户按下一个键时,将触发
onKeyDown
事件。当用户释放一个键时,将触发
onKeyUp
事件。 当用户按下并释放一个键时,会触发
onKeyPress
事件。(
onKeyDown
后跟onKeyUp
)。我理解前两个,但是
onKeyPress
与onKeyUp
不同吗? 有点困惑,有人可以帮我清除一下吗?
#1 楼
在此处查看此答案中最初使用的存档链接。从该链接开始:
从理论上讲,
onKeyDown
和onKeyUp
事件表示正在按下或释放的键。 ,而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 楼
KeyPress
,KeyUp
和KeyDown
分别类似于:Click
,MouseUp,
和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 楼
这里的大多数答案更多地侧重于理论而不是实际问题,并且keyup
和keypress
之间存在一些很大的差异,因为它涉及输入字段值,至少在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
是作为onkeydown
和onkeyup
的组合触发的,或者取决于键盘重复次数(当未触发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在不同浏览器中对
input
和textarea
的行为有所不同(主要是由于失去焦点)如果您想将文本区域的高度调整为内容,您可能不会使用onKeyDown,而是使用onKeyPress(PS,在这种情况下,实际上最好使用onChange)。
我已经在项目中使用了全部3个,但不幸的是,可能已经忘记了一些语用学。 (需要注意:还有
input
和change
事件)评论
我没想到要在字段内容中添加换行符,但是这实际上很重要。
– 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
释放密钥时最后触发一次。
触发元密钥。
这是
addEventListener
和jQuery
的行为。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">
)仍会根据所按下的按键触发所有按键,按键按下和按键事件。
评论
我发现,如果按住TAB键不放,它将连续循环遍历所有字段,并且仅触发“ onkeydown”。keypress事件表示正在键入的可用于输入的字符,例如'a','D','£','©'等。另一方面,keydown和keyup事件表示正在键入的任何键,包括退格键,制表符,上,下,home,end等。
“(或者是否可以释放一个键(KeyUp)而无需按下(KeyDown)键?)”-是的。例如,Tab键:keyup事件可能无法与keydown捕获相同的元素。