检测用户是否有物理键盘的最可靠方法是什么?
一个想法是,由于没有物理键盘window.onkeydown
可以undefined
(而不是null
)。但是由于虚拟键盘,我认为情况并非如此。虽然我没有测试。
如果用户没有键盘,我的目标是让在线计时器替换为轮式input[type='number']
选择器。
检测用户是否有物理键盘的最可靠方法是什么?
一个想法是,由于没有物理键盘window.onkeydown
可以undefined
(而不是null
)。但是由于虚拟键盘,我认为情况并非如此。虽然我没有测试。
如果用户没有键盘,我的目标是让在线计时器替换为轮式input[type='number']
选择器。
对于带有键盘、鼠标和触摸屏的 Microsoft Surface 等设备,这变得非常棘手。您可以在任何给定时间混合所有 3 种输入模式,或添加另一种输入法,如手写笔。
微软正在采取将输入事件抽象为“指针事件”的方法。此模型已提交给 W3C。这应该让您了解管理输入的趋势。
尽管如此,我发现查看触摸是否可用并在假设用户将至少在某些时候使用触摸输入的情况下操作是很方便的。这可能会导致设计决策以消除对触摸完全不友好的事物,即使这可能意味着损害鼠标/键盘功能。
在您的特定情况下,我会仔细研究您是否甚至需要input[type=number]
用自定义控件替换。大多数触摸设备都相当现代,并且许多具有标准 HTML 输入的自定义、触摸友好版本。
还要记住本机控件可能“开箱即用”很好地支持的可访问性场景。
如果您决定实现自定义控件,那么我建议您检测触摸功能并显示您的自定义控件,无论是否存在其他输入机制。这意味着确保自定义控件(至少)是触摸/键盘/鼠标友好的。
这是我当前的触摸测试(声明明天可能会中断,当然还没有在每台设备上测试过):
var supportsTouch = ("ontouchstart" in window) || window.navigator.msMaxTouchPoints > 0;
我看到两种方法。
第一种方法是监听每个鼠标和键盘事件。拥有鼠标的用户很可能也拥有键盘。访问网站的用户可能会移动鼠标。
第二种方法是检查用户代理以读取正在运行的操作系统,并假设 Android 和 iOS 设备没有任何键盘。对于 Windows 8,我看不出用户代理有什么帮助,因为 Windows 8 可以在平板电脑和台式机/笔记本电脑上运行。
不过,我宁愿有一个更优雅的解决方案。
检测触摸屏并显示特殊小部件更可靠;只需确保键盘仍然可以与您的精美小部件一起使用,以方便访问。
您可以通过检查操作系统甚至屏幕尺寸来确定键盘类型。Android、iOS 和所有小屏幕设备往往没有物理键盘。