用javascript检测键盘布局

IT技术 javascript jquery keyboard-layout
2021-03-05 19:16:35

有没有办法使用 JavaScript 检测当前的键盘布局?我找到了这个,但它只检测访问者是否在英文布局上。我需要知道作为字符串的确切布局,例如de-ch,fren

6个回答

我知道这个问题很老,但是对于那些因某些键映射到其他语言环境中的不同字符而受阻的人来说,这里有一种方法可以用来处理它。

最有可能的是,您将键盘事件处理程序绑定到 keyup 或 keydown 事件;在这种情况下, event.which 或 event.keyCode 属性的结果与用户按下的键相关联。例如,您用来键入“;”的相同键 在 EN 布局中是用于在 RU 布局中键入“ж”的键,并且事件报告 186 作为它们的代码。

但是,如果您对按键产生的字符更感兴趣,则应改用 'keypress' 事件。此事件在 keydown/up 后触发,并报告在 event.which 或 event.charCode 中键入的字符的实际 unicode 代码点,在上例中为十进制 1078 或 U+0436。

因此,如果您不想猜测键盘布局并且不需要区分 keyup/keydown,keypress 可能是您的一个可行替代方案。这并不完美(大多数浏览器不会一致地报告不打印字符的键上的按键事件,例如修饰键、功能键和导航键),但在处理可打印字符时,这比猜测键码要好。

“并且事件报告了 186 作为他们两个的代码。” 我认为这是错误的。试试这个小提琴jsfiddle.net/BWPaz并尝试在不同的键盘语言环境之间切换。我个人在美国英语语言环境和法国语言环境中获得不同的代码。
2021-04-17 19:16:35
@JackM 对于位于同一键上的不同俄语和英语符号,我得到了相同的键代码。铬,Windows 8.1。
2021-05-05 19:16:35

键盘布局没有标准化的标识符。布局创建者为它们分配了名称。它们可能具有作为一个定义属性的语言关联。

键盘布局不应与语言或区域设置标识符混淆。特别是没有单一的“英语布局”,而是有几十种布局可以用于英语。

我认为系统通常不会通过 JavaScript 使其当前的布局设置可读。

因此,无论您尝试通过检测键盘布局来解决什么问题,都需要采用不同的方法。

我所知道的关于这个主题并且已经为它实现了一个解决方案的所有内容是检测非英语布局键盘,即使用除英语以外的任何字母表的语言解决方案是依靠正则表达式来匹配任何单词字符\w、任何数字字符\d和一系列预定义的英文键盘特殊字符,因此任何其他字符,如阿拉伯语、日语等都不会匹配,所有这些都使用 keydown 事件和我我正在使用此解决方案来限制和通知登录表单中的用户名密码字段条目我把它打包成一个如下的函数:

function checkKeyboard(ob,e){
        re = /\d|\w|[\.\$@\*\\\/\+\-\^\!\(\)\[\]\~\%\&\=\?\>\<\{\}\"\'\,\:\;\_]/g;
      a = e.key.match(re);
      if (a == null){
        alert('Error 2:\nNon English keyboard layout is detected!\nSet the keyboard layout to English and try to fill out the field again.');
        ob.val('');
        return false;
      }
      return true;
    } 

然后从事件中调用函数,如下所示:

$("#textFieldId").keydown(function(e){
        if (!checkKeyboard($(this),e)){
            return false;
        }
    });

这是不知名选民的工作演示

注意:

在正则表达式模式中,re您可以添加任何缺少的特殊字符,例如 #、`、| 等

您可以添加以添加\s到模式以包含空格。
2021-05-15 19:16:35
@itzjackyscode 因为它主要是为密码和用户名而设计的。
2021-05-16 19:16:35

您现在可以使用 Navigator 接口返回的 Keyboard 对象。此对象提供对检索键盘布局映射和切换从物理键盘捕获按键的功能的访问。

请参阅https://developer.mozilla.org/en-US/docs/Web/API/Keyboard

目前,此功能是实验性的,仅适用于某些主要浏览器。

你正在寻找的是如何检测他们的Locale。在 HTTP 标头中,它存储在Accept-Language标头中,但浏览器无法通过纯 JS 使用该标头。

有一个名为“浏览器语言的 jQuery 插件可能会让您走上正确的道路。

好的,非常感谢。也许我会让用户自己选择它。或者您知道是否可以在 Java 中确定它?我想将键盘布局提供给带有参数的 Java 小程序,但也许我可以重写小程序。
2021-04-16 19:16:35
感谢您的回答!这适用于大多数访问者,但有些访问者的键盘布局与接受语言不同。例如,我的标题是Accept-Language: de,en;q=0.7,en-us;q=0.3虽然我的键盘设置为de-ch(特殊字符与普通字符不同de-de)。有没有直接获取布局的方法?
2021-04-23 19:16:35
无法获得布局,只能根据语言进行猜测。是的,如果是 Querty 与 Divorak 或繁体中文与简体中文,您可能无法确定。再想一想..我意识到,它可能被检测到,但..它会参差不齐。您基本上必须等待用户输入内容,然后检查密钥代码。
2021-04-25 19:16:35
Accept-Language、浏览器语言(这有几个含义)和键盘布局都是不同的东西。你最多只能从别人那里猜出键盘语言,而且你经常会猜错。
2021-05-07 19:16:35