当前位置: 首页 > 知识库问答 >
问题:

Mootools: numpad keyup和keydown事件返回同一个键的不同键值

陆阳曜
2023-03-14

谁能解释一下为什么numpad keyup和keydown事件返回不同的键值?

考虑一下这个:

<input type="text" />
<script>
    document.getElement('input').addEvents({
    'keydown':function(e){
            console.log('keydown: code:' + e.code + ', key:' + e.key);
    },
    'keyup':function(e){
            console.log('keyup  : code:' + e.code + ', key:' + e.key + '\n');
        }
    });
</script>

我本来以为每个事件都会为键降和键增返回相同的键值,但相反,我得到了下面的输出(在按0,1,2,8和9之后):

按键:代码:96,按键:0<br>按键:代码:96,按键`

keydown:代码:97,密钥:1
keyup:代码:97,密钥:a

向下键:代码:98,键:2
向上键:代码:98,键:b

按键:代码:104,按键:8
按键:代码:104,按键:h

向下键:代码:105,键:9
向上键:代码:105,键:i

通常我会使用按键,因此,从来没有任何问题。当在键盘上按下相应的数字小键盘键(向下突出显示,向上取消突出显示)时,我在屏幕上突出显示数字小键盘代表按钮时遇到了这种情况。

有什么想法吗?

共有2个答案

岳曦
2023-03-14

在侦听按键和键控事件时使用 e.code 而不是 e.key。e.key仅在按键事件中可靠。

请参见:

  • http://mootools.net/docs/core/Types/DOMEvent
  • http://www.quirksmode.org/js/keys.html
漆雕彦
2023-03-14

不同的浏览器如何实现键下、按键和键控事件存在很大的混乱,甚至键降和键控事件中的 keyCode 值也尚未跨浏览器标准化。

当前,事件对象有三个属性,其中包含有关按键的信息:

  • 字符码 - 按下字符键的 Unicode 值
  • keyCode - 表示用户按下的键的数字
  • 其中 - 按下字母数字键的键代码或字符代码编号

按下的键的值存储在keyCode或charCode属性中,但不会同时存储在这两个属性中,keyCode始终在keydown和keyup事件中设置,charCode在keypress事件中设置。

因此,例如,如果您按“e”:

  • 键降和键控报告:
    • 字符代码 = 0,keyCode = 69,其中 = 69 - 数字 69 处的卡拉克特是大写字母 E
      < li>charCode=101,keyCode=0,其中=101 -第101个字符是小写字母e

    如果你在numpad中按9号:

    • 键降和键控报告:
      • charCode=0,keyCode=105,其中=105 - 数字105处的卡拉克特是小写字母i
        < li>charCode=57,keyCode=0,其中=57 -第57个字符是数字9

      Mootools试图通过添加event.code和event.key属性来标准化事物:

      event.code = event.which || event.keyCode;
      event.key = String.fromCharCode(code).toLowerCase();
      

      它还转换数字小键盘上数字的键代码,但仅适用于键控事件(版本 1.4.5 ),而不适用于键控。我不知道这是有意还是无意的,但是可以通过替换mootools-core-1.4.5-全无相容中的行1163来轻松修改键控事件以具有相同的行为.js:

      if (type == 'keydown') {
      

      自:

      if (type == 'keydown' || type == 'keyup') {
      

      这样,keyup事件中的keyCodes也将被转换。

      有趣的是,Mozilla 开发者网络说:

      charCode ',' keyCode '和' which '已被弃用,您应该使用' char '或' key '来代替,如果可用的话。

      但是我还没有在火狐或Chrome中看到这种实现。jQuery为事件对象添加了“键”属性,但它总是“未定义”(可能取决于浏览器的实现)。

 类似资料:
  • 我发现了很多相关的问题(这里和其他地方),但没有具体找到这个问题。 我正在尝试侦听箭头键(37-40)的键关闭事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“keydown”事件。 示例:http://blog.pothoven.net/2008/05/keydown-vs-keypress-in-javascript.html 在该页面上,单击“在此处键入 - 但是,如果我做同样的事情,但

  • 我一直试图为pyplay开发一个“文本框”类,作为一个小小的个人项目,我遇到了一个真正难倒我的问题。我试图扩展在这里找到的pyplay文本输入类,把它包装在一个支持多行和滚动功能的文本框类中。 当我试图在文本行之间上下移动闪光灯时,问题就来了。基本上,一旦按下“向上”箭头,就会将闪光灯一直移动到顶部,然后它就不再响应向下移动。 下面是我如何给类事件的代码: 下面是文本框类的代码(来自上述代码):

  • 在我们开始学习键盘的相关内容之前,请注意,在现代设备上,还有其他“输入内容”的方法。例如,人们使用语音识别(尤其是在移动端设备上)或用鼠标复制/粘贴。 因此,如果我们想要跟踪 <input> 字段中的所有输入,那么键盘事件是不够的。无论如何,还需要一个名为 input 的事件来跟踪 <input> 字段中的更改。对于这样的任务来说,这可能是一个更好的选择。稍后我们将在 事件:change,inpu

  • 遇到了 keyup 和 keydown 区别的问题,于是自己简单在控制台输出了一个小写字母 a。 这是 keydown 的输出打印。 这是 keypress 的打印。 为什么这两个事件对象返回字母 a 的 keyCode 编码竟然不一致?

  • 我是新来的PHP,一直在使用社区和答案在这里,真正帮助我的一个小项目,我正在工作,所以提前感谢大家的帮助到目前为止! 我正在提取保存在格式不良的文本文件/提要中的大量信息,修剪特殊字符的内容,然后使用查找其他特定字符串,并用逗号(,)或分号(;)替换它们,以创建一段可用的文本。然后我想在这个文本中搜索特定的关键字,并返回文本的其他部分。 到目前为止,我已经成功地将文本分解成多维数组,但我现在还不知

  • 嗨,我写了一个mapreduce作业,它一般解析XML文件。我能够解析XML文件并正确生成所有键值对。我有6个不同的键和相应的值。所以我并行运行6个不同的减速器。 现在我面临的问题是,reducer将两个不同的键 - 值对放在同一个文件中,其余4个键值放在单个文件中。因此,简而言之,在化简器输出的6个文件中,我得到了4个具有单键值对的文件和1个具有两个键值对的文件以及1个没有任何内容的文件。 我尝