这三件事有什么不同?在谷歌上我发现:

当用户按下一个键时,onKeyDown事件被触发。 当用户释放密钥时触发onKeyUp事件。 当用户按下并释放一个键时触发onKeyPress事件 (onKeyDown紧接着onKeyUp)。

我理解前两个,但不是onKeyPress相同的onKeyUp?是否有可能释放一个键(onKeyUp)而不按它(onKeyDown)?

这有点混乱,有人能帮我解释一下吗?


当前回答

我观察到的keyup和keydown之间的区别是

如果我们为keydown事件附加一个事件处理程序,并记录输入框的值,即 (e.target.value)它返回keydown事件之前的值

但是如果我们为keyup事件附加一个事件处理程序并记录输入框的值 它返回最新的值,包括被按下的键

让我们用例子来理解


// the latest keypressed is not shown in e.target.value
// when keydown event handler is executed
// since until the keyup is not triggered 
// the input box will not have that character in its value
const searchCitiesEleKeyDown = document.querySelector("#searchCities");
searchCitiesEleKeyDown.addEventListener("keydown", (e) => {
  console.log(e.target.value);
});


// but in case of keyup event the e.target.value prints 
// the text box content with the latest character pressed
// since as soon as the keyup event triggers
// the input box will have that character pressed in its value
const searchCitiesEleKeyUp = document.querySelector("#searchCities");
searchCitiesEleKeyUp.addEventListener("keyup", (e) => {
  console.log(e.target.value);
});
<input type="text" id="searchCities" />

CodeSandbox链接 https://codesandbox.io/s/keydown-vs-keyup-wpj33m

其他回答

点击这里查看这个答案中最初使用的存档链接。

从这个链接:

理论上,onKeyDown和onKeyUp事件表示正在按下或释放的键,而onKeyPress事件表示正在键入的字符。该理论在所有浏览器中的实现并不相同。

似乎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事件都是在按下键时触发的,而不是在按下键时触发的。

不同之处在于,事件不是一次触发,而是多次触发(只要您按住键)。要意识到这一点,并相应地处理它们。

onkeypress事件适用于所有浏览器中除ALT, CTRL, SHIFT, ESC以外的所有键,其中onkeydown事件适用于所有键。意思是onkeydown事件捕获所有的键。

砰....

如果你想检查哪个键被按下,使用onkeypress或onkeydown,但如果你想从文本字段中获取文本,然后检查最后按下的键,例如,你正在扫描条形码,你想在按下ENTER键时触发一个even(几乎所有的条形码扫描器都在最后发送13个“ENTER”),那么你应该使用onkeyup,否则你将无法在文本字段中输入文本。

例如

<输入类型=“文本” 类=“表单控件” @bind=“@barcode” @onkeyup=“条形码扫描” 占位符=“扫描” />

这将调用BarCodeScan函数后,你将立即按enter键入的代码,或者如果你从扫描仪扫描它,BarCodeScan函数将被自动调用。如果你在这里使用“onkeypress”或“onkeydown”,那么绑定将不会发生,你将不会从文本框中获得文本。

这里的大多数答案更多地集中在理论而不是实际问题上,至少在Firefox中(在43中测试),keyup和keypress在输入字段值方面有一些很大的区别。

如果用户在空的输入元素中输入1:

input元素的值将是按键处理程序中的空字符串(旧值) 在keyup处理程序中,input元素的值将是1(新值)。

如果您所做的工作依赖于知道输入后的新值,而不是当前值,例如内联验证或自动制表符,那么这一点至关重要。

场景:

用户在输入元素中输入12345。 用户选择文本12345。 用户输入字母A。

当输入字母A后触发按键事件时,文本框现在只包含字母A。

But:

Field.val()是12345。 美元Field.val()。长度为5 用户选择是一个空字符串(防止您通过覆盖选择来确定删除了什么)。

这样看来,浏览器(Firefox 43)擦除用户的选择,然后触发按键事件,然后更新字段内容,然后触发keyup。