这三个事件有什么区别?谷歌搜索后,我发现:
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 );
}
在此处查看此答案中最初使用的存档链接。
从该链接:
理论上,
onKeyDown
和onKeyUp
事件代表按键被按下或释放,而onKeyPress
事件代表正在输入一个字符。该理论的实现在所有浏览器中并不相同。
大部分的答案在这里更侧重于理论而不是实际的问题,并有存在着很大的差异keyup
,并keypress
因为它涉及到输入字段值,至少在Firefox(43测试)。
如果用户1
输入一个空的 input 元素:
输入元素的值将是keypress
处理程序内的空字符串(旧值)
输入元素的值将是处理程序1
内的(新值)keyup
。
如果您正在做一些依赖于知道输入后的新值而不是当前值(例如内联验证或自动制表符)的操作,这一点至关重要。
设想:
12345
输入元素。12345
。A
。当keypress
输入字母后事件触发时A
,文本框现在只包含字母A
。
但:
12345
.5
因此,浏览器(Firefox 43)似乎会擦除用户的选择,然后触发keypress
事件,然后更新字段内容,然后触发keyup
.
onkeydown
当键按下时触发(就像在快捷键中一样;例如, in Ctrl+A
,Ctrl
被按住“按下”。
onkeyup
释放键时触发(包括修饰符/等键)
onkeypress
被烧制的组合onkeydown
和onkeyup
,或根据键盘重复(当onkeyup
不触发)。(这种重复行为是我没有测试过的。如果你做了测试,请添加评论!)
textInput
(仅限 webkit)在输入某些文本时触发(例如,Shift+A
将输入大写的“A”,但Ctrl+A
会选择文本而不输入任何文本输入。在这种情况下,将触发所有其他事件)
首先,它们有不同的含义:它们开火:
其次,某些键会触发其中一些事件,而不会触发其他事件。例如,
此外,您应该记住,event.keyCode
(和event.which
)通常对于 KeyDown 和 KeyUp 具有相同的值,但对于 KeyPress 具有不同的值。试试我创建的游乐场。顺便说一下,我注意到了一个奇怪的现象:在 Chrome 中,当我按下ctrl+a并且input
/textarea
为空时,KeyPress 会以event.keyCode
(和event.which
)等于1
! (当输入不为空时,它根本不会触发)。
最后,还有一些语用学:
textarea
,KeyPress 和 KeyDown 都会触发多次(Chrome 71),如果我需要多次触发的事件和 KeyUp 用于单键释放,我会使用 KeyDown。input
s 和textarea
s 在不同浏览器中的行为不同(主要是由于失去焦点)我在我的项目中使用了所有 3 个,但不幸的是可能忘记了一些语用学。(要注意:还有input
和change
事件)