这三件事有什么不同?在谷歌上我发现:
当用户按下一个键时,onKeyDown事件被触发。 当用户释放密钥时触发onKeyUp事件。 当用户按下并释放一个键时触发onKeyPress事件 (onKeyDown紧接着onKeyUp)。
我理解前两个,但不是onKeyPress相同的onKeyUp?是否有可能释放一个键(onKeyUp)而不按它(onKeyDown)?
这有点混乱,有人能帮我解释一下吗?
这三件事有什么不同?在谷歌上我发现:
当用户按下一个键时,onKeyDown事件被触发。 当用户释放密钥时触发onKeyUp事件。 当用户按下并释放一个键时触发onKeyPress事件 (onKeyDown紧接着onKeyUp)。
我理解前两个,但不是onKeyPress相同的onKeyUp?是否有可能释放一个键(onKeyUp)而不按它(onKeyDown)?
这有点混乱,有人能帮我解释一下吗?
当前回答
答:更新
KeyDown
当你按住键时,会触发多次。 触发元键。
键盘按键
当你按住键时,会触发多次。 不触发元键。
KeyUp
当你释放钥匙时,最后会触发一次。 触发元键。
这是addEventListener和jQuery中的行为。
https://jsbin.com/vebaholamu/1/edit?js,console,output <——试试例子
(答案已编辑正确的回答,截图和示例)
其他回答
“KeyPress”现已弃用。请使用KeyDown键。
KeyPress, KeyUp和KeyDown分别类似于:Click, MouseUp和MouseDown。
先下 第二个按键发生(当输入文本时) Up发生在最后(当文本输入完成时)。
webkit是个例外,它有一个额外的事件:
keydown
keypress
textInput
keyup
下面是一个片段,你可以自己看看什么时候事件被触发:
窗口。addEventListener(“弹起”,日志); 窗口。addEventListener(“键盘按键”,日志); 窗口。addEventListener(“keydown”、日志); 对数函数(事件){ console.log(事件。类型); }
首先,它们有不同的含义:它们发射:
KeyDown -当一个键被按下 KeyUp -当按下的按钮被释放时,在input/textarea的值被更新之后(其中唯一的一个) KeyPress -在这些和之间并不意味着按键被按下和释放(见下文)。它不仅具有不一致的语义,而且已弃用,因此不应该使用它(另请参阅此摘要)
其次,一些键触发其中一些事件,而不触发其他事件。例如,
KeyPress忽略删除,箭头,PgUp/PgDn, home/end, ctrl, alt, shift等,而KeyDown和KeyUp不(参见下面关于esc的详细信息); 当你在Windows中通过alt+选项卡切换窗口时,只有alt触发的KeyDown,因为窗口切换发生在任何其他事件之前(并且KeyDown选项卡是由系统阻止的,我想,至少在Chrome 71中)。
另外,你应该记住那个事件。keyCode(和event.which)通常对KeyDown和KeyUp有相同的值,但对KeyPress有不同的值。试试我创造的游乐场。顺便说一句,我注意到一个怪癖:在Chrome浏览器中,当我按ctrl+a和输入/文本区域是空的,为按键触发事件。keyCode(和event.which)等于1!(当输入不为空时,它根本不会触发)。
注意:这些天,使用事件。key是最有用的选项,因为它是跨浏览器、操作系统和事件标准化的(afaik)。
最后,还有一些语用学:
For handling arrows, you'll probably need to use onKeyDown: if user holds ↓, KeyDown fires several times (while KeyUp fires only once when they release the button). Also, in some cases you can easily prevent propagation of KeyDown but can't (or can't that easily) prevent propagation of KeyUp (for instance, if you want to submit on enter without adding newline to the text field). Suprisingly, when you hold a key, say in textarea, both KeyPress and KeyDown fire multiple times (Chrome 71), I'd use KeyDown if I need the event that fires multiple times and KeyUp for single key release. KeyDown is usually better for games when you have to provide better responsiveness to their actions. esc is usually processed via KeyDown: KeyPress doesn't fire and KeyUp behaves differently for inputs and textareas in different browsers (mostly due to loss of focus) If you'd like to adjust height of a text area to the content, you probably won't use onKeyDown but rather onKeyPress (PS ok, it's actually better to use onChange for this case).
我在我的项目中使用了这三个,但不幸的是,我可能忘记了一些语用学。(需要注意的是:还有输入和更改事件)
onkeypress事件适用于所有浏览器中除ALT, CTRL, SHIFT, ESC以外的所有键,其中onkeydown事件适用于所有键。意思是onkeydown事件捕获所有的键。
砰....
如果你想检查哪个键被按下,使用onkeypress或onkeydown,但如果你想从文本字段中获取文本,然后检查最后按下的键,例如,你正在扫描条形码,你想在按下ENTER键时触发一个even(几乎所有的条形码扫描器都在最后发送13个“ENTER”),那么你应该使用onkeyup,否则你将无法在文本字段中输入文本。
例如
<输入类型=“文本” 类=“表单控件” @bind=“@barcode” @onkeyup=“条形码扫描” 占位符=“扫描” />
这将调用BarCodeScan函数后,你将立即按enter键入的代码,或者如果你从扫描仪扫描它,BarCodeScan函数将被自动调用。如果你在这里使用“onkeypress”或“onkeydown”,那么绑定将不会发生,你将不会从文本框中获得文本。
一些实际的事实可能有助于决定要处理哪个事件(运行下面的脚本并关注输入框):
“输入”(美元)。上(“钥匙键盘”,e=>控制台。打字,e.keyCode, e. yg, e.key) <剧本剧本src = " https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js " > < / > 输入< - >
压:
非插入/键入键(例如Shift, Ctrl)将不会触发按键。按Ctrl并释放它: 按键17 17控制 按键17 17控制 将字符转换应用到其他字符的键盘上的键可能会导致死键和重复的“键”(例如~,´)。按´并释放它,以显示双重´´: 死亡192 按键192 192´´ 按键180°180° 按键180°180° 死了192
此外,非键入输入(例如,rang <input type="range">)仍然会根据按下的键触发所有的keyup, keydown和keypress事件。