onKeyPress Vs. onKeyUp和onKeyDown
这三个事件有什么区别? 谷歌搜索时,我发现
KeyDown事件在用户按下按键时被触发。
KeyUp事件在用户释放密钥时触发。
KeyPress事件在用户按下并释放一个键时触发。 (onKeyDown后跟onKeyUp)
我理解前两个,但不是KeyPress和KeyUp一样吗? (或者是否可以释放一个键( KeyUp )而不按( KeyDown )呢?)
这有点混乱,有人可以帮我解决这个问题吗?
在这里查看存档的副本 (截至2017年9月5日,原始链接不再可访问,但由于它是原始答案的一部分,所以留在这里): http : //www.bloggingdeveloper.com/post/KeyPress-的KeyDown-KEYUP最差之间Javascript的琴键Events.aspx
从那个链接:
理论上,keydown和keyup事件代表被按下或释放的键,而keypress事件代表被键入的字符。 理论的实现在所有的浏览器中都不相同。
KeyPress,KeyUp和KeyDown分别与Click,MouseUp和MouseDown类似。
*发生第一次,*发生第二次(输入文本时),*发生最后一次(文本输入完成时)。
webkit是个例外,它在那里有一个额外的事件:
keydown keypress textInput keyup
当键被关闭时, onkeydown
被触发(例如在快捷键中;例如,在Ctrl+A
, Ctrl
被按下。
当key被释放时(包括修饰符/ etc键), onkeyup
被触发
onkeypress
作为onkeydown
和onkeyup
的组合,或者取决于键盘重复(当onkeyup
没有被触发时)。 (这个重复的行为是我没有测试过的,如果你测试了,请添加注释!)
textInput
输入一些文本(例如, Shift+A
将输入大写字母“A”,但是Ctrl+A
将选择文本并且不输入任何文本输入时,将触发textInput
(仅webkit)),在这种情况下,所有其他事件被触发。
看起来,onkeypress和onkeydown是一样的(如上面已经提到的快捷键的小差异)。
你可以试试这个:
<textarea type="text" onkeypress="this.value=this.value + 'onkeypress '"></textarea><br/> <textarea type="text" onkeydown="this.value=this.value + 'onkeydown '" ></textarea><br/> <textarea type="text" onkeyup="this.value=this.value + 'onkeyup '" ></textarea><br/>
你会看到onkeypress和onkeydown事件都是在按下按键时触发的,而不是在按下按键时触发的。
不同之处在于事件不是一次触发而是多次触发(只要按住键即可)。
如果您使用其中一些事件,请注意并处理您的代码运行的次数。
对于我的英语来说,这个课程很糟糕。
onkeypress事件适用于除了ALT,CTRL,SHIFT,ESC之外的所有浏览器,其中onkeydown事件适用于所有键。 意味着onkeydown事件捕获所有的关键。
这里的大多数答案都是关注于理论而不是实际问题,而keyup
和keypress
之间有一些很大的区别,至少在Firefox中(在43中进行了测试)与输入字段值有关。
如果用户输入1
到一个空的输入元素:
-
输入元素的值在
keypress
处理程序中将是一个空字符串(旧值) -
输入元素的值将在
keyup
处理程序中为1
(新值)。
如果你正在做一些依赖于输入之后的新值而不是当前值(如内联验证或自动标签)的事情,这是至关重要的。
场景:
- 用户键入
12345
到输入元素。 - 用户选择文本
12345
。 - 用户键入字母
A
输入字母A
后keypress
事件触发时,文本框现在只包含字母A
但:
- Field.val()是
12345
。 - $ Field.val()。length是
5
- 用户选择是一个空字符串(防止您通过覆盖选择来确定被删除的内容)。
因此,浏览器(Firefox 43)似乎会擦除用户的选择, 然后触发keypress
事件, 然后更新字段内容, 然后触发keyup
。
一方面,有一个明显的含义:当一个键被按下时,onKeyDown会被触发,当一个被按下的按键被释放时,onKeyUp会被触发,onKeyPress当一个键被按下和释放时被触发。
另一方面,有些钥匙会烧掉其中一些钥匙,而不会开火。 例如,KeyPress忽略删除,箭头,home / end,ctrl,alt,shift等,而KeyDown和KeyUp则不会。
最后,有一些语用学。 对于处理箭头,您可能需要使用onKeyDown:如果用户持有“向下”KeyDown触发多次(和KeyPress只触发一次!)。 此外,在某些情况下,您可以轻松防止KeyDown的传播,但不能(或不那么容易)阻止KeyUp的传播(例如,如果您希望在不添加换行符的情况下提交)。 如果你想调整文本区域的高度的内容,你可能不会使用onKeyDown,而是onKeyPress。 我已经在我的项目中使用了所有3个,但不幸的是可能忘记了一些语用学。
基本上,这些事件在不同的浏览器类型和版本上有所不同,我创建了一个jsBin测试,你可以检查控制台,找出这些事件是如何针对你的目标环境的,希望对你有所帮助。 http://jsbin.com/zipivadu/10/edit
Jan Wolter的这篇文章是我遇到的最好的一篇,你可以在这里找到存档的副本。
它很好地解释了所有的浏览器关键事件,
keydown事件发生在键被按下时,紧接着按键事件。 然后在释放密钥时生成密钥事件。
要理解keydown和keypress之间的区别,区分字符和键是非常有用的。 一个键是电脑键盘上的物理按键。 字符是通过按下按钮键入的符号。 在美式键盘上, 按住Shift键的同时按下4键通常会产生“美元符号”字符。 世界上每个键盘上都不一定是这种情况。 理论上, keydown和keyup事件代表被按下或释放的键 ,而keypress事件代表被键入的字符。 实际上,这并不总是如此。
有一段时间,一些浏览器在按键之后立即触发了一个名为textInput的附加事件。 DOM 3标准的早期版本旨在替代按键事件,但后来撤销了整个概念。 Webkit在版本525和533之间支持这个,我被告知IE支持它,但是我从来没有发现,可能是因为Webkit要求它被称为textInput而IE被称为textinput 。
还有一个叫做输入的事件,在所有浏览器都支持的情况下,只要对文本区域或输入字段进行更改就会被触发。 通常情况下,按键会触发,然后输入的字符会出现在文本区域,然后输入将会触发。 输入事件实际上并不提供任何有关输入键的信息 – 您必须检查文本框以确定哪些内容已更改 – 所以我们并不真正将其视为关键事件,并且不在此处记录它。 虽然它最初只是为textareas和输入框定义的,但我相信还有一些运动可以将它推广到其他类型的对象上。