【问题标题】:KeyboardEvent in Chrome, keyCode is 0Chrome中的KeyboardEvent,keyCode为0
【发布时间】:2012-01-20 14:13:06
【问题描述】:

我正在尝试在调度的事件对象上设置 keyCode。

单击按钮时,文本框控件上会引发事件以模拟 keydown 事件。事件已成功引发,但 keyCode 为 0。我需要将具有正确 keyCode 的事件对象发送到文本框。 我一直在使用来自here 的代码。

如何在dispatch事件中设置keyCode值?

<html>
    <head>      
    </head>
    <body>
        <input type="button" id="btn" value="Click"></input>
        <input type="text" id="txt"></input>
        <script>
            document.getElementById('btn').addEventListener("click", btnClick);
            document.getElementById('txt').addEventListener("keydown", txtKeydown);         

            function btnClick(e) {
                var txt = document.getElementById('txt');               

                var dispatchKeyboardEvent = function(target, initKeyboradEvent_args) {
                    var e = document.createEvent("KeyboardEvents");
                    e.initKeyboardEvent.apply(e, Array.prototype.slice.call(arguments, 1));
                    e.keyCode = 83;
                    e.charCode = 0;
                    target.dispatchEvent(e);
                };

                var canceled = !dispatchKeyboardEvent(txt,
                'keydown', true, true,  // type, bubbles, cancelable
                window,  // window
                's',  // key
                0, // location: 0=standard, 1=left, 2=right, 3=numpad, 4=mobile, 5=joystick
                false, false, false);  // Ctr, Alt, Shift
            }

            function txtKeydown(e) {
                console.dir(e);
                console.log(e.keyCode);
            }

        </script>
    </body>
</html>

【问题讨论】:

标签: javascript google-chrome keyboard-events keydown


【解决方案1】:

我很惊讶这个错误已经存在了很长时间。似乎有一种使用通用事件的解决方法。这是一个演示:http://jsbin.com/awenaq/3

【讨论】:

  • 这个错误仍然存在!
  • @Philip 你能解释一下这个演示吗?您似乎已经为按下的按钮输入了键码,这不是 chrome 无法判断按下哪个键的解决方法。
  • @Sumit:演示展示了在手动触发事件时如何使用通用事件而不是KeyboardEvent。
  • 该错误在 Google 错误跟踪器中存在很长时间:code.google.com/p/chromium/issues/…
  • 由于keyCode is deprecated,这不太可能修复。 keyCodeKeyboardEvent 是从 WebKeyboardEvent 创建时设置,并且您不能从 JS 调用该构造函数。见herehere
【解决方案2】:

您提出这个问题似乎已经有一段时间了,所以您可能已经找到了问题的答案。如果你还没有,有一个bug in Webkit 指出this SO question 导致keyCode 始终为0。显然在他们修复它之前你无能为力。可悲的是,看起来似乎没有人真正在研究它。这不是你想听到的答案,但它确实是现在任何人都可以给你的唯一答案。

【讨论】:

    【解决方案3】:

    我在使用 Android 设备(例如 Sony Xperia 和 HTC 设备)时遇到了同样的问题。所以我找到了替代解决方案:请参阅我对这个问题的回答 KeyCode Returns 0 Always

    【讨论】:

      【解决方案4】:

      如果你有 jQuery:

      $.Event(event, { keyCode: 13 });

      这是预期用途。
      Source

      【讨论】:

        【解决方案5】:

        发生这种情况是因为(正如其他人所说)正在调用 KeyboardEvent 对象(使用 charCode 而不是 keyCode)而不是 Event 对象。 使用时:

        function txtKeydown(e) {
            console.dir(e);
            console.log(e.keyCode);
        }
        

        如果您将0 打印到控制台,请尝试使用e.charCode 而不是e.keyCode

        有关 KeyboardEvent 的更多信息,请参阅 MDN 网络文档: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

        【讨论】:

          【解决方案6】:

          这不是一个错误...这个功能正在被淘汰、弃用、禁止,明天会是什么名字...您不能长期依赖此功能。 ...并且是一个开放的安全风险...找到另一种方法来做你想做的事情。查阅 MOZILLA 规格,您会看到 BIG BAD RED BANNER 警告要像瘟疫一样避免这种情况。 他们不会修复它,通过返回 0 他们有效地停止了流血而不更改代码,除非在一个总是将 keyCode 转换为 0 的地方。

          【讨论】:

          • 如果您将参考链接添加到您的答案中,您将不会被否决。
          • 您认为 MOZILLA 的哪些部分不作为参考?
          • 很好的参考,我指的是缺少链接
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-20
          • 1970-01-01
          • 2019-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多