onKeyPress Vs. onKeyUp和onKeyDown

这三个事件有什么区别? 谷歌搜索时,我发现

KeyDown事件在用户按下按键时被触发。

KeyUp事件在用户释放密钥时触发。

KeyPress事件在用户按下并释放一个键时触发。 (onKeyDown后跟onKeyUp)

我理解前两个,但不是KeyPressKeyUp一样吗? (或者是否可以释放一个键( 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+ACtrl被按下。

当key被释放时(包括修饰符/ etc键), onkeyup被触发

onkeypress作为onkeydownonkeyup的组合,或者取决于键盘重复(当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事件捕获所有的关键。

这里的大多数答案都是关注于理论而不是实际问题,而keyupkeypress之间有一些很大的区别,至少在Firefox中(在43中进行了测试)与输入字段值有关。

如果用户输入1到一个空的输入元素:

  1. 输入元素的值在keypress处理程序中将是一个空字符串(旧值)

  2. 输入元素的值将在keyup处理程序中为1 (新值)。

如果你正在做一些依赖于输入之后的新值而不是当前值(如内联验证或自动标签)的事情,这是至关重要的。

场景:

  1. 用户键入12345到输入元素。
  2. 用户选择文本12345
  3. 用户键入字母A

输入字母Akeypress事件触发时,文本框现在只包含字母A

但:

  1. Field.val()是12345
  2. $ Field.val()。length是5
  3. 用户选择是一个空字符串(防止您通过覆盖选择来确定被删除的内容)。

因此,浏览器(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事件发生在键被按下时,紧接着按键事件。 然后在释放密钥时生成密钥事件。

要理解keydownkeypress之间的区别,区分字符是非常有用的。 一个是电脑键盘上的物理按键。 字符是通过按下按钮键入的符号。 在美式键盘上, 按住Shift键的同时按下4键通常会产生“美元符号”字符。 世界上每个键盘上都不一定是这种情况。 理论上, keydownkeyup事件代表被按下或释放的 ,而keypress事件代表被键入的字符。 实际上,这并不总是如此。

有一段时间,一些浏览器在按键之后立即触发了一个名为textInput的附加事件。 DOM 3标准的早期版本旨在替代按键事件,但后来撤销了整个概念。 Webkit在版本525和533之间支持这个,我被告知IE支持它,但是我从来没有发现,可能是因为Webkit要求它被称为textInput而IE被称为textinput

还有一个叫做输入的事件,在所有浏览器都支持的情况下,只要对文本区域或输入字段进行更改就会被触发。 通常情况下,按键会触发,然后输入的字符会出现在文本区域,然后输入将会触发。 输入事件实际上并不提供任何有关输入键的信息 – 您必须检查文本框以确定哪些内容已更改 – 所以我们并不真正将其视为关键事件,并且不在此处记录它。 虽然它最初只是为textareas和输入框定义的,但我相信还有一些运动可以将它推广到其他类型的对象上。