iPad的蓝牙键盘返回任何键onKeyUp的0代码

有些客户在使用iPad蓝牙键盘将文本input到我们的某个内部网站时,一直在报告问题。 当使用桌面或屏幕键盘上的iPad时,主要按某个input上的input可以正常工作,而使用连接到iPad的蓝牙键盘时则不会。

经过调查发现,当连接到iPad上的蓝牙键盘时, onKeyUp任何input都返回0作为键码。 演示工作正常,但是当使用屏幕键盘时,因为keycode返回0,所以不工作。 我创build了这个jsFiddle来演示。 它在Chrome和Safari上都经过了testing,其结果与onKeyPress相同,但在onKeyUp只返回0。

 $('#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> 

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

testing研究

我刚才做了一些testing,发现在iOS Safari上使用蓝牙键盘的keyUp事件中,唯一的键就是属性e.keye.charCodee.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事件触发您的应用程序,并且您需要匹配除这些特殊键以外的键,唯一可以提出的解决scheme是使用keyDown事件来捕获键,然后侦听那个keyDown事件中的keyDown事件就像这样:

 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) 

此外

在快速search“UIKeyInput”之后,我发现UIKeyInput是“UIResponder的一个子类用于实现简单文本input的一组方法”。 ( Apple的开发人员文档 )这将解释这些键名称的特殊语法。