我正在试着解决为什么在流行的移动操作系统上,在一个简单的文本区域中,似乎不可能将detect a shift+Enter个脚本组合在一起.
核心问题是:传统的Web应用程序假定按Enter键提交,并按Shift+Enter键换行,这只在Android上有问题.
基本上,代码只有以下一条:
<textarea id="my-textarea"></textarea>
var myInput = document.getElementById( 'my-textarea' );
myInput.addEventListener('keyup', function(e) {
// if pressing "Enter"
if( e.keyCode == 13 ) {
// and if pressing "shift"
if (e.shiftKey) {
// just a new line
// this does not work on Android
} else {
// submit
}
}
} );
正如我将要展示的,这似乎在任何浏览器but Android中都能像预期的那样工作,从来没有shiftKey
到任何真正的值.
你可以使用这个很好的工具来验证自己:
https://w3c.github.io/uievents/tools/key-event-viewer.html个个个
大多数设备上的"Shift+Enter"事件表
如果我理解正确的话,这是大多数设备上假定的JavaScript事件表:
https://w3c.github.io/uievents/tools/key-event-viewer.html个个个
上述正确情况已在以下位置得到验证:
- 台式机、物理键盘、Linux、Firefox 111
- 台式机、物理键盘、Linux、Chromium 111
- 手机,Android 11 LineageOS,虚拟键盘《黑客键盘》,带股票浏览器
- 手机,Android 11 LineageOS,虚拟键盘《黑客键盘》,搭配Firefox 110
- feel free to add other devices but I'm quite sure that this is the very correct behavior个
Android常用键盘"Shift+Enter"事件表:BUG?
但是,在许多使用默认虚拟键盘的Android设备上,似乎没有从JavaScript中察觉到Shift+Enter键:
https://w3c.github.io/uievents/tools/key-event-viewer.html个个个
上述有问题的情况转载于:
- 移动、Android 11 LineageOS、普通键盘AOSP、Firefox 110
- 移动、Android 11 LineageOS、股票键盘AOSP、DuckDuckGo浏览器
- 移动、Android 11 LineageOS、股票键盘AOSP、股票浏览器
请注意,对于所有这些有问题的情况,我使用的是默认键盘(普通的Android AOSP键盘).所以它看起来真的像是一个错误,与JavaScript没有任何关系,也与我的Anyone Web开发技能没有任何关系.
如何在虚拟键盘上按Shift+Enter?
请注意,我认为大多数虚拟键盘都支持一种简单的方式来键入Shift+Enter组合键.常见示例:
- 用一根手指按住Shift键,再用另一根手指按Enter键
- 按两下Shift键(使其保持活动状态),然后按Enter键
- 从Shift键拖动,在Enter键上拖放(这是一个有效的手势,例如写大写字母)
For example here you see I double-tapped the left shift (that assumes a more-prominent color), then I pressed Enter.
这个特定的屏幕截图来自Android 11 AOSP,它没有正确发送Shift+Enter组合键.即使如你所见,它看起来就像其他任何支持Shift键的键盘一样(例如,就像iPhone的虚拟键盘一样,它可以代替它工作).
资源
- https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key-Mozilla Web文档有一个非常有用的页面来解释应该发生什么,这表明我在Android键盘上看到的不符合标准
-
https://developer.mozilla.org/en-US/docs/Web/API/Element/keydown_event-
keydown
键盘事件的完整文档 - https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/shiftKey-应该反映Shift键状态的特定标志的描述(它似乎根本不适用于此版本的Android键盘)
-
https://github.com/valerio-bozzolan/dom-event-viewer/commit/4a48a9a92818ea5bd31260326dbbc54a5c3c3e45-我还派生了DOM事件查看器来测试
<textarea>
个元素以及默认的<input type="text" ... />
个元素,是的,即使使用该元素,我也可以重现相同的结果
问题
- 在这种情况下,有没有什么已知的解决办法可以建议给JavaScript程序员,以识别Android默认键盘中的Shift+Enter?
- 在你看来,这是安卓的一个漏洞吗?如果是,是否知道Android AOSP存在上行问题?