这三个事件有什么区别?通过谷歌搜索,我发现:
onKeyDown
事件在用户按下键时触发。onKeyUp
事件在用户释放键时触发。onKeyPress
事件在用户按下并释放键(即先触发onKeyDown
,再触发onKeyUp
)时触发。
我理解前两个事件,但是 onKeyPress
不就和 onKeyUp
一样吗?有可能只释放键(onKeyUp
)而不按下键(onKeyDown
)吗?
这有点令人困惑,请有经验的人帮忙解答一下?
这三个事件有什么区别?通过谷歌搜索,我发现:
onKeyDown
事件在用户按下键时触发。onKeyUp
事件在用户释放键时触发。onKeyPress
事件在用户按下并释放键(即先触发onKeyDown
,再触发onKeyUp
)时触发。
我理解前两个事件,但是 onKeyPress
不就和 onKeyUp
一样吗?有可能只释放键(onKeyUp
)而不按下键(onKeyDown
)吗?
这有点令人困惑,请有经验的人帮忙解答一下?
注意:现在已经弃用了KeyPress
事件,请使用KeyDown
代替。
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 );
}
keypress
, keyup
和keydown
类比于click
,mouseup
和mousedown
。对我来说,这个自然的解释是keypress
事件与keyup
同时触发(就像click
和mouseup
)。如果不是这样,那么您当时的意思是什么? - Mark Amery请查看此链接以获取存档的原始回答。
从该链接中可以得知:
理论上,
onKeyDown
和onKeyUp
事件代表按下或释放键,而onKeyPress
事件则代表输入字符。但是不同浏览器的实现并不相同。
keyup
和 keypress
之间存在一些重要的差异,至少在 Firefox 中(测试版本为 43)。1
:
keypress
处理程序中输入框的值将是一个空字符串(旧值)。
keyup
处理程序中输入框的值将是新值 1
。
12345
。12345
。A
。A
后触发 keypress
事件时,文本框中仅包含字母 A
。Field.val()
的值为 12345
。$Field.val().length
的值为 5
。keypress
事件,接着更新字段内容,最后触发 keyup
。其次,某些按键会触发其中一些事件,但不会触发其他事件。例如,
input
/textarea
为空时,KeyPress 会触发并且 event.keyCode(和 event.which)等于 1
! (当输入不为空时,它根本不会触发)。event.key
和event.code
是最有用的选项,因为它在浏览器、操作系统和事件中都是标准化的(据我所知),而event.which
和event.keyCode
已经被弃用(1,2)。textarea
中,KeyPress和KeyDown都会多次触发(Chrome 71),如果我需要多次触发的事件,我会使用KeyDown,单个键释放则使用KeyUp。input
和textarea
的行为不同(主要是由于失去焦点)我在我的项目中使用了所有3种,但不幸的是可能忘记了某些实用技巧。(请注意:还有和事件)
onkeydown
在按下键时触发(例如快捷键中的Ctrl+A
,其中保持'按下'状态的是Ctrl
)。
onkeyup
在释放键后触发(包括修改键/等键)。
onkeypress
作为onkeydown
和onkeyup
的组合触发,或者根据键盘重复触发(当onkeyup
未触发)。 (这种重复行为是我没有测试过的。如果您进行了测试,请添加注释!)
textInput
(仅适用于WebKit)在输入一些文本时触发(例如,Shift+A
会输入大写字母'A',但是Ctrl+A
将选择文本而不输入任何文本输入内容。在这种情况下,所有其他事件都会被触发)
这篇由Jan Wolter撰写的文章是我所见过最好的,如果链接失效,可以在此处找到存档副本。
它清楚地解释了所有浏览器键盘事件,
keydown事件在按下按键时立即发生,随后紧接着会生成keypress事件。当松开按键时,会生成keyup事件。
理解keydown和keypress之间的区别,有助于区分字符和键。一个键是计算机键盘上的物理按钮。通过按下按钮来输入一个符号称为字符。在美式键盘上,按下Shift键并同时按下4键通常会产生一个“美元”符号。但这并不一定适用于世界上的所有键盘。理论上,keydown和keyup事件表示按下或释放键,而keypress事件表示键入一个字符。但实际上,并非总是这样实现。
一段时间内,一些浏览器会在keypress事件后立即发出一个称为textInput的附加事件。DOM3标准的早期版本旨在将其作为keypress事件的替代,但整个概念后来被撤销了。Webkit在525到533版本之间支持此功能,我被告知IE也支持它,但我从未检测到,可能是因为Webkit要求它被称为textInput而IE称其为textinput。
所有浏览器都支持一种名为input的事件,该事件在对textarea或输入字段进行更改后立即触发。通常,会先触发keypress事件,然后键入的字符将出现在文本区域中,然后才会触发input事件。实际上,input事件并不提供任何关于所键入的键的信息 - 您必须检查文本框才能找出更改了什么 - 因此我们不认为它是一个按键事件,并且在这里也没有详细说明。虽然最初只定义用于文本区域和输入框,但我相信有一些运动朝向在其他类型的对象上触发该事件。
看起来,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 事件在按下按键时被触发,而不是按键被松开时被触发。
它们的区别在于事件不仅仅被触发一次,而是多次触发(只要你按着键不放)。请注意这一点并相应地进行处理。
keypress
事件,但它们总是会触发keydown
事件。 - CPHPython更新的答案:
KeyDown
KeyPress
KeyUp
这是在addEventListener
和jQuery
中的行为。
https://jsbin.com/vebaholamu/1/edit?js,console,output <-- 尝试示例
(答案已经通过正确的回答、截图和示例进行了编辑)
在所有浏览器中,除了ALT、CTRL、SHIFT、ESC键外,onkeypress事件适用于所有键,而onkeydown事件适用于所有键。这意味着onkeydown事件可以捕获所有按键。
我想分享一个有趣的事情:
当使用onkeydown事件激活JS方法时,该事件的charcode与使用onkeypress时获得的charcode不同!
例如,使用onkeypress时,数字键盘上的键将返回与字母键上方的数字键相同的charcodes,但是在使用onkeydown时不会返回相同的charcodes!
当我使用onkeydown时检查特定charcodes的脚本失败时,我花了很多时间才弄清楚原因!
演示:https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
是的。 我知道方法的定义是不同的..但非常令人困惑的是,在两种方法中,事件的结果都是使用event.keyCode检索的..但它们不返回相同的值..这不是一种非常明确的实现。
0123456789
)的情况是一样的。 - Mrigank Pawagi