【问题标题】:How do I detect hardware keyboard presence with javascript?如何使用 javascript 检测硬件键盘的存在?
【发布时间】:2020-03-30 08:59:35
【问题描述】:

使用 javascript 检测硬件键盘存在的最佳跨浏览器和跨平台方法是什么?

【问题讨论】:

  • 您可以让用户按下触摸屏键盘上不存在的键吗?像任何使用 CtrlAlt 的东西一样?
  • @millimoose nuh uh
  • 无论如何。 XY 问题。你最终想要完成什么?为什么需要检测这个?给我们一点背景。
  • 你知道 facebook 聊天吗?您只需按“Enter”即可发送消息,我必须向没有键盘按钮的用户展示替换“Enter”键。
  • 一个好的设计是一致的,把按钮展示给大家。为什么假设人们仍然知道 [enter]?更多的做事方式通常意味着更高的生产力。你可以dbl-click一个窗口标题栏来最大化它,或者你可以使用一个组合键,或者最大化图标,或者左上角的窗口菜单,或者任务栏上下文菜单等等。没有人抱怨有太多的方法最大化...

标签: javascript keyboard


【解决方案1】:

这可能是一个老问题,但几个月前,我自己也在寻找解决方案。我正在构建一个消息传递系统,当有人在物理键盘上点击Return 时应该发送消息,但是当有人在虚拟键盘上点击Return 时插入换行符。我解决它的方法是计算keydownkeyup 事件之间的时间,并获得Return 被击中的平均值。

我终于有时间在我的博客 here 上记录它。

【讨论】:

  • 非常聪明,我最终在自己的应用程序中使用了这个解决方案。谢谢!
  • 这很聪明
【解决方案2】:

你能尝试理论上相反的吗?与其尝试检测键盘硬件,不如尝试检测触摸屏?通过ontouchstart 事件;

if ('ontouchstart' in document.documentElement) {
    // show icon
}

【讨论】:

  • 如果 PC 有触摸屏?
  • 好吧,如果 iPad 上连接了键盘,你会怎么做?显示一个简单的图标听起来像是很多代码。
  • 许多黑莓设备都有触摸屏和物理键盘
【解决方案3】:

JS 中的键盘可以通过委托给 OS API 的浏览器 API 访问,并且无法判断是否有物理键盘。我现在可以切断物理键盘的电源线,打开虚拟键盘,用鼠标单击屏幕上的按钮,浏览器仍然会触发脚本正在侦听的每个键盘事件。从浏览器/JS 的角度来看,虚拟键盘与物理键盘没有区别。

“存在”到底是什么意思?如果我有一部带有触摸屏和滑出式键盘的手机,您是否希望浏览器触发某种“keboardIn”/“keyboardOut”事件?与电缆插入/输出相同吗? :)

如果您的应用绝对需要物理键盘,只需通知/询问用户即可。

编辑 - 在 OP 澄清后:

你知道 Facebook 聊天吗?您只需按一下即可发送消息 “Enter”,我必须向没有键盘按钮的用户展示 替换“Enter”键。

所以只需制作一个带有文本输入的表单并监听输入/表单事件。大多数(每个?)软键盘都有某种“完成”、“就绪”或类似的按钮。您不需要知道“keyCode”是否等于“13”,但可以检测到用户有提交他键入的内容的意图。或者,作为最后的手段,检测我启用触摸的设备,然后显示按钮。 (if('ontouchstart' in document.documentElement)/* show touch sbmit button */)

【讨论】:

  • 我正在制作一个默认使用键盘控制的游戏,但我想检测是否没有键盘,以便我可以设置屏幕控制。
【解决方案4】:

使用键盘事件来检测用户是否有键盘(他/她可能会按下它)。保存到localStorage,下次浏览器会记住。

var app = this;
app.hasKeyboard = false;
this.keyboardPress = function() {
    app.hasKeyboard = true;
    $(window).unbind("keyup", app.keyboardPress);
    localStorage.hasKeyboard = true;
    console.log("has keyboard!")
}
$(window).on("keyup", app.keyboardPress)
if(localStorage.hasKeyboard) {
    app.hasKeyboard = true;
    $(window).unbind("keyup", app.keyboardPress);
    console.log("has keyboard from localStorage")
}

【讨论】:

  • 这不会告诉你它是什么类型的键盘(硬件或虚拟)
【解决方案5】:

当移动设备的屏幕上弹出虚拟键盘时,应用程序的高度会减小以适应虚拟键盘。因此,您可以做的是添加一个事件侦听器,以检查屏幕是否在用户关注输入字段时调整了大小。

您可以在输入字段获得焦点时使用调整大小事件监听器添加此功能:

const inputField = document.querySelector(".my-input");

const virtualKeyboardDetected = () => alert("Virtual keyboard detected!");

inputField.addEventListener("focusin", () => {
    window.addEventListener("resize", virtualKeyboardDetected )
})
inputField.addEventListener("focusout", () => {
    window.removeEventListener("resize", virtualKeyboardDetected )
})

【讨论】:

    【解决方案6】:
    if (confirm('Do you have hardware keyboard?')) {
    
    } else {
    
    }
    

    根据问题的cmets中的描述进行编辑:

    如果每次都支持“输入”并为触摸屏添加“发送”图标 (What's the best way to detect a 'touch screen' device using JavaScript?) 并作为鼠标的“悬停”伪类,怎么样?

    【讨论】:

    • 但是你能想象如果facebook的每个页面都问“你有硬件键盘吗?” :D
    • 不可以,但是你可以做一次,然后存储在cookie中。
    • 如果用户先从电脑登录然后再登录到手机,即使将其保存到数据库也很不舒服?这不是一个好的解决方案...
    • 是的,可能不舒服,但我建议您学习一些有关 HTTP cookie 的知识,然后您就会知道每个浏览器的 cookie 都是唯一的。
    • 谢谢你的笑声,伙计
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多