有没有办法使用 JavaScript 检测当前的键盘布局?我找到了这个,但它只检测访问者是否在英文布局上。我需要知道作为字符串的确切布局,例如de-ch
,fr
或en
。
用javascript检测键盘布局
我知道这个问题很老,但是对于那些因某些键映射到其他语言环境中的不同字符而受阻的人来说,这里有一种方法可以用来处理它。
最有可能的是,您将键盘事件处理程序绑定到 keyup 或 keydown 事件;在这种情况下, event.which 或 event.keyCode 属性的结果与用户按下的键相关联。例如,您用来键入“;”的相同键 在 EN 布局中是用于在 RU 布局中键入“ж”的键,并且事件报告 186 作为它们的代码。
但是,如果您对按键产生的字符更感兴趣,则应改用 'keypress' 事件。此事件在 keydown/up 后触发,并报告在 event.which 或 event.charCode 中键入的字符的实际 unicode 代码点,在上例中为十进制 1078 或 U+0436。
因此,如果您不想猜测键盘布局并且不需要区分 keyup/keydown,keypress 可能是您的一个可行替代方案。这并不完美(大多数浏览器不会一致地报告不打印字符的键上的按键事件,例如修饰键、功能键和导航键),但在处理可打印字符时,这比猜测键码要好。
键盘布局没有标准化的标识符。布局创建者为它们分配了名称。它们可能具有作为一个定义属性的语言关联。
键盘布局不应与语言或区域设置标识符混淆。特别是没有单一的“英语布局”,而是有几十种布局可以用于英语。
我认为系统通常不会通过 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
您可以添加任何缺少的特殊字符,例如 #、`、| 等
您现在可以使用 Navigator 接口返回的 Keyboard 对象。此对象提供对检索键盘布局映射和切换从物理键盘捕获按键的功能的访问。
请参阅https://developer.mozilla.org/en-US/docs/Web/API/Keyboard
目前,此功能是实验性的,仅适用于某些主要浏览器。
你正在寻找的是如何检测他们的Locale。在 HTTP 标头中,它存储在Accept-Language标头中,但浏览器无法通过纯 JS 使用该标头。
有一个名为“浏览器语言”的 jQuery 插件可能会让您走上正确的道路。