跨浏览器跨操作系统的方式获得keyCode/字符按下keydown事件
Cross-Browser Cross-OS way to get keyCode/character pressed onkeydown event
例如:
<input type='text' onkeydown='doSomething()' />
<script>
function doSomething() {
// ?
}
</script>
我需要得到keyCode/字符按在跨浏览器/操作系统的方式。怎么做呢?我已经尝试过这个~6年前,因为我记得那个时候,这并不容易,有时我必须通过事件或其他东西来让它在opera或IE上工作cmiw
你很接近,但你的代码的问题是你正在执行doSomething()
响应keyDown
事件…让我们仔细看看-你正在执行doSomething
而没有在中传递任何参数。你也没有命名/接受参数,即使你传递了它们。
对你的代码进行一些快速的调整,你就都设置好了:
// Notice an `event` argument, containing the important data
function doSomething(event) {
console.log('****** doSomething');
console.log('event.keyCode: ', event.keyCode);
console.log('event.which: ', event.which);
console.log('event.key: ', event.key);
console.log('event.code: ', event.code);
}
<!-- Notice: We pass the key `event` object into doSomething -->
<input type='text' onkeydown='doSomething(event)' placeholder="Type here..." />
如何确定按了哪个键
我也很困惑,但让我们回顾一下选项。准备好迎接1995年的浏览器差异吧!
首先,请记住,虽然最终目标可能是确定按下了哪个键,但不同的方法需要不同的步骤才能达到这一点。事件可以是"依赖于系统和实现的数字代码"、Unicode字符值、Ascii值或实际的键名("ArrowUp")。
event.key
( TL;博士:尝试使用这个)
根据MDN KeyboardEvent.key
文档,如果您正在寻找未弃用的,"未来"的方式,event.key
是推荐的方式。文档正在进行大量修改,因此MDN上的细节很少。
查看caniuse.com对event.key
的支持表,在IE11以下或Safari上根本没有支持(截至2017年1月)。这可能已经是一个交易破坏者,所以让我们继续寻找。
event.keyCode
我一直使用event.keyCode
, MDN说现在已弃用,并带有此警告:
你应该尽量避免使用这个;它已经被弃用一段时间了。相反,如果实现了
KeyboardEvent.code
,您应该使用它。不幸的是,有些浏览器仍然不支持它,所以你必须小心确保你使用的是所有目标浏览器都支持的浏览器。Google Chrome和Safari已经实现了KeyboardEvent.keyIdentifier
,它在规范草案中定义,但不是最终规范。
好吧,足够公平-浏览器之间有足够的差异和keydown
和keypress
事件之间的细微差异(不是同一件事!),使这个不值得再使用了。愿keyCode
安息,这是真的!
event.which
From MDN docs:
按下的特定键的数字代码,取决于按下的是字母数字键还是非字母数字键。请参阅KeyboardEvent。charCode**和KeyboardEvent。keyCode查看详细信息。
在弃用过程中的另一个-"此功能已从Web标准中删除。尽管一些浏览器可能仍然支持它,但它正在被放弃。"
好的,我们已经知道keyCode
也被弃用了,那么charCode
是关于什么的呢?
event.charCode
返回keypress
事件的Unicode字符代码…然后我们从MDN得到另一个警告:
不要再使用这个属性了,它已经被弃用了。用
KeyboardEvent.key
代替。
在这里开始追逐我们自己的尾巴,KeyboardEvent.key
是未来的方法,但尚未得到充分支持…对于keydown
事件,它也始终返回0
,您必须侦听keypress
事件,这样才有价值。
event.code
最后一个选项似乎很有希望…event.code
docs from MDN:
表示键盘上的物理键(与按下该键生成的字符相反)。换句话说,该属性返回的值不会因键盘布局或修饰键的状态而改变。
这很方便,因为我们得到了像ShiftRight
和ShiftLeft
这样的东西,这对游戏开发和非常具体的交互很有用。文档底部有一个很棒的图表,上面有所有的代码选项。
的问题是:还没有很好的支持。在IE, iOS, Safari, Android或Opera上没有。
<标题>所以…我应该用什么?我不认为有一个放之四海而皆准的解决方案。当前的场景似乎需要一定程度的填充,或者至少支持旧的event.keyCode
和event.which
属性,作为event.key
和event.code
不能使用的后备。
对于生产项目,我们只需要考虑浏览器和设备支持需求,然后从那里开始。
转变Windows/Etc/Ctrl/命令/
如果您关心与原始键组合按下的其他键,则需要检查一些额外的属性:
- event.altKey
- event.ctrlKey
- event.metaKey
- event.shiftKey
方便工具:keycode.info
一个非常有价值的工具,可以快速找出你需要写逻辑的keyCode是http://keycode.info/(由v. cool Wes Bos创建)
标题>…我6年前就试过了……
在现代…
document.querySelector('input').addEventListener(function(e) {
var key = e.keyCode || e.which;
...
});
编辑:工作在"现代"浏览器,IE9+和其他船员。
- 在粘贴事件Javascript的输入字段中删除所有非数字字符
- 将具有特殊字符的值传递给函数onclick事件
- 限制用户使用按键事件 injQuery 复制和粘贴声明为数字文本框的文本框中的字符
- 使用dojo按键事件时无法避免最后一个字符输入
- 按键时的Javascript事件,但在输入字符之后
- 使用 OnChange 事件更新状态具有延迟字符
- 文本框事件中的第三个字符
- 如何在文本框点击事件中设置文本框中字符的第一个位置---Chrome问题
- 如何仅允许特定打印范围的按键事件中的字符
- onchange 事件更新状态,延迟为 1 个字符
- 在键按下事件上计算文本字段中的字符数
- 如何在输入至少 3 个字符后触发事件键下
- 如何使用 Keydown 事件在多种语言/键盘布局中获取正确的字符
- “键下”事件:找到本来可以输入的字符,如果 shift 也被按下
- range.toString()截断javascript按键事件中的最后一个字符
- 关注keydown事件后的字段,不插入字符
- javascript事件的问题.只提供大写字符
- 键盘事件、字符计数器和textLength道具困境
- Javascript事件按键检查字符代码
- 在键盘上获得正确的字符事件