这三个事件之间有什么区别?谷歌搜索后发现:
- 在
onKeyDown
当用户按下一个键触发事件。- 在
onKeyUp
当用户释放一个键触发事件。onKeyPress
当用户按下并释放一个键(onKeyDown
后跟onKeyUp
)时,将触发该事件。
我了解前两个,但onKeyPress
与onKeyUp
?是否可以在onKeyUp
不按()的情况下释放键(onKeyDown
)?
这有点令人困惑,有人可以帮我解决这个问题吗?
这三个事件之间有什么区别?谷歌搜索后发现:
- 在
onKeyDown
当用户按下一个键触发事件。- 在
onKeyUp
当用户释放一个键触发事件。onKeyPress
当用户按下并释放一个键(onKeyDown
后跟onKeyUp
)时,将触发该事件。
我了解前两个,但onKeyPress
与onKeyUp
?是否可以在onKeyUp
不按()的情况下释放键(onKeyDown
)?
这有点令人困惑,有人可以帮我解决这个问题吗?
Answers:
在此处查看此答案中最初使用的存档链接。
从该链接:
理论上,
onKeyDown
和onKeyUp
事件代表按下或释放的键,而onKeyPress
事件代表正在键入的字符。该理论的实现并非在所有浏览器中都相同。
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 );
}
keypress
和keydown
事件实际上是被分配了相同的.timeStamp
值,该值精确到5微秒的间隔,但这并不是我的意思。我的意思是该click
事件在您释放鼠标按钮之前不会触发,因此说这keypress
是键盘版本,click
使其听起来好像keypress
在您释放键之前不会触发。实际上,情况并非如此:按下键时会触发,就像这样keydown
。所以keypress
实际上根本不类似于click
。
keypress
,keyup
和keydown
类似于click
,mouseup
和mousedown
。对我而言,对此的自然解释是keypress
在keyup
(click
和和一样mouseup
)同时触发。什么没有你的意思是,如果不是呢?
这里的大多数答案更多地侧重于理论而非实际问题,并且至少在Firefox中(在43中进行了测试),它们之间keyup
以及keypress
与输入字段值之间存在一些较大差异。
如果用户键入1
一个空的输入元素:
输入元素的值将是keypress
处理程序中的空字符串(旧值)
输入元素的值将是处理程序中的1
(新值)keyup
。
如果您要执行的操作依赖于输入后知道新值而不是当前值(例如,内联验证或自动制表),那么这至关重要。
场景:
12345
输入元素。12345
。A
。当keypress
事件在输入字母后触发时A
,文本框现在仅包含字母A
。
但:
12345
。5
因此,似乎浏览器(Firefox 43)会删除用户的选择,然后触发keypress
事件,然后更新字段内容,然后触发keyup
。
onkeydown
按下键时会触发(例如快捷方式;例如,在中Ctrl+A
,Ctrl
按住。
onkeyup
释放键(包括修饰键/ etc键)时触发
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
事件)
此文章由Jan沃尔特是我碰上了最好的一块,你可以找到归档副本这里如果链接已经死了。
它很好地解释了所有浏览器按键事件,
该KEYDOWN事件发生时,按下该键,紧接着的按键事件。然后,释放键时会生成keyup事件。
要理解的区别KEYDOWN和按键,这是区分有用字符和键。一个关键是计算机的键盘上的物理按键。甲字符是通过按压按钮类型的符号。在美国键盘上,4在按住键的同时按下Shift键通常会产生“美元符号”字符。世界上的每个键盘不一定都是这种情况。从理论上讲,keydown和keyup事件表示按下或释放的键,而keypress事件表示正在键入的字符。实际上,这并不总是实现方式。
有一段时间,一些浏览器在按键后立即触发了另一个事件,称为textInput。DOM 3标准的早期版本打算以此来代替按键事件,但是整个概念后来被撤销了。Webkit在525和533版本之间支持此功能,但有人告诉我IE支持它,但我从未检测到,可能是因为Webkit要求将其称为textInput,而IE称为textinput。
还有一个名为input的事件,受所有浏览器支持,该事件在对textarea或input字段进行更改后立即触发。通常,按键将触发,然后键入的字符将出现在文本区域中,然后输入将触发。该输入事件实际上并不给什么键被输入的任何信息-你不得不检查文本框弄明白发生了什么变化-所以我们真的不认为这是一个关键事件,并不能真正在这里记录它。尽管它最初仅是为文本区域和输入框定义的,但我相信在将其推广到其他类型的对象上也有一些发展。
似乎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事件都是在按下键时触发的,而不是在按下键时触发的。
区别在于事件不会被触发一次,而是会被触发多次(只要按住该键即可)。请注意这一点并进行相应处理。
keypress
事件,但它们始终会触发keydown
。
onkeypress事件适用于所有浏览器中的ALT,CTRL,SHIFT,ESC等所有键,而onkeydown事件适用于所有键。意味着onkeydown事件捕获所有键。
只想分享好奇心:
当使用onkeydown事件激活JS方法时,该事件的字符代码与您通过onkeypress获得的字符不同!
例如,在使用onkeypress时,小键盘键将返回与字母键上方的数字键相同的字符,但在使用onkeydown时,返回的字符将不相同!
花了我几秒钟的时间来弄清楚为什么使用onkeydown时检查某些字符代码的脚本失败了!
演示:https : //www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
是的。我确实知道方法的定义是不同的..但是令人非常困惑的是,在两种方法中,事件的结果都是使用event.keyCode ..检索的,但是它们没有返回相同的值。声明式实现。
0123456789
)
基本上,这些事件在不同的浏览器类型和版本上的行为有所不同,我创建了一个jsBin测试,您可以检查控制台以了解这些事件在目标环境中的行为,希望能有所帮助。http://jsbin.com/zipivadu/10/edit
更新的答案:
按键
按键
按键
这是双方的行为addEventListener
和jQuery
。
https://jsbin.com/vebaholamu/1/edit?js,控制台,输出 <-尝试示例
(答案已编辑,答案,截图和示例正确无误)
一些实际的事实可能对决定处理哪个事件有用(运行下面的脚本并专注于输入框):
$('input').on('keyup keydown keypress',e=>console.log(e.type, e.keyCode, e.which, e.key))
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input/>
紧迫:
非插入/打字密钥(例如Shift,Ctrl)不会触发keypress
。按下Ctrl并释放它:
按键17 17控制
键盘17 17控制
从适用的字符转换为其他字符的键盘按键可能会导致死亡和复制的“钥匙”(例如~,´上)keydown
。按下´并释放它以显示双倍´´
:
按下192192死
键盘192192´´
按键180180´
按键180180´
键盘192192死
此外,非键入输入(例如range <input type="range">
)仍会根据按下的键触发所有的keyup,keydown和keypress事件。