【问题标题】:iPad Bluetooth keyboard returns keycode of 0 for any key with onKeyUpiPad 蓝牙键盘为任何带有 onKeyUp 的键返回键码 0
【发布时间】:2018-02-06 01:26:28
【问题描述】:

一些客户在使用他们的 iPad 蓝牙键盘向我们的一个内部网站输入文本时报告了问题。在使用桌面或 iPad 屏幕键盘时,主要在某个输入上按 enter 可以正常工作,但在使用连接到 iPad 的蓝牙键盘时则不行。

经调查,当连接到 iPad 上的蓝牙键盘时,onKeyUp 的任何输入似乎都会返回 0 作为键码。该演示工作正常,但是当使用屏幕键盘时它不起作用,因为键码返回 0。I created this jsFiddle to demonstrate. 它在 Chrome 和 iPad 版 Safari 上进行了测试,与onKeyPress 工作正常的结果相同,但只返回0 与onKeyUp

$('#inputKeyUp').keyup(function (event){
	$("#outputKeyUp").text("Key Up Key: " + event.which);
});

$('#inputKeyPress').keypress(function (event){
	$("#outputKeyPress").text("Key Press Key: " + event.which);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="inputKeyUp">keyup</textarea>
<div id="outputKeyUp">Key Up Key:</div>
<b/>
<textarea id="inputKeyPress">keypress</textarea>
<div id="outputKeyPress">Key Press Key:</div>

编辑:刚刚向 Apple 报告了该错误。我们会看看有没有什么结果。

【问题讨论】:

  • 自己试过了,同样的问题(iOS 9)。看起来这个问题已经有一段时间了:stackoverflow.com/questions/18985117/…。这可能是 Safari 中的一个错误。在不同的浏览器上会发生同样的事情吗?
  • @Sidney 是的,我也在 Chrome 中测试过

标签: javascript html ios ipad bluetooth


【解决方案1】:

测试研究

我刚刚对此进行了一些测试,发现在 iOS Safari 上使用蓝牙键盘时的 keyUp 事件中,唯一能在属性e.key、@987654324 方面提供任何适当反馈的键@、e.keyCodee.which 是以下键:

  • 逃跑
  • 向上箭头
  • 左箭头
  • 右箭头
  • 向下箭头

所有其他键返回以下内容:

{
    key: "Dead",
    charCode: 0,
    keyCode: 0,
    which: 0
}

这些特殊键(escape 和箭头键)仅根据 UIKeyInput{PascalCasedKeyName} 语法在 e.key 属性上返回不同的值:

  • UIKeyInputEscape
  • UIKeyInputUpArrow
  • UIKeyInputLeftArrow
  • UIKeyInputRightArrow
  • UIKeyInputDownArrow

总结

在 iOS 上,根据我的快速研究,您可以在 keyUp 事件中识别的唯一键是 Escape 和四个 Arrow keys,通过在 e.key 属性上匹配它们的名称。这些值也会出现在keyDown 事件中。

如果您仍然需要等到您的应用程序触发 keyUp 事件,并且您需要匹配这些特殊键以外的键,我能想出的唯一解决方案是使用 keyDown 事件进行捕获关键,但随后在keyDown 事件inside 中监听keyUp 事件,如下所示:

el.addEventListener("keydown", e => {
    if (e.which === 13) // Enter key, or which ever key code you'd like
        el.addEventListener("keyup", function keyUp(e) {
            el.removeEventListener("keyup", keyUp, false) // Memory clean-up

            // Your code here
        }, false)
}, false)

此外

快速搜索“UIKeyInput”后,我发现UIKeyInput 是“UIResponder 的子类用于实现简单文本输入的一组方法”。 (Apple's Developer Documentation) 这将解释这些键名的特殊语法。

【讨论】:

    【解决方案2】:

    这是 keyup 事件中输入键的解决方法。

    if (event.type === 'keyup') {
        //this is to handle the enter button on an ipad bluetooth keyboard
        if (event.key === 'Enter') {
            event.which = event.keyCode = 13;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多