19

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

4

6 回答 6

16

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

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

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

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

于 2012-10-10T18:28:47.247 回答
13

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

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

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

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

于 2012-01-17T10:04:07.523 回答
4

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

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

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

于 2021-04-25T07:29:50.023 回答
3

我对这个主题的所有了解并已经实现了一个解决方案,就是检测非英语布局键盘,即使用除英语之外的任何字母的语言。解决方案是依靠正则表达式匹配任何单词字符\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您可以添加任何缺少的特殊字符,例如 #、`、| 等

于 2017-12-05T13:55:50.243 回答
1

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

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

于 2012-01-17T09:36:00.610 回答
1

您可以使用 event.code 从任何布局中确定实际的键位,试试http://keycode.info/

于 2020-06-21T20:47:10.787 回答