有没有一种方法可以使用JavaScript检测当前键盘布局?我找到了这篇文章,但它只能检测访问者是否处于英文键盘布局。我需要知道确切的布局字符串,例如de-ch
、fr
或en
。
我知道这个问题很旧,但对于那些被事实阻碍的人们,有些按键在其他语言环境下会映射到不同的字符,下面提供一种处理方法。
很可能,您将键盘事件处理程序绑定到了keyup或keydown事件;此时,事件中event.which或event.keyCode属性的结果与用户按下的键有关。例如,在EN布局中用于键入';'的相同键是RU布局中用于键入'ж'的键,并且事件报告186作为它们两者的代码。
但是,如果您更感兴趣的是按键后产生的字符,那么您应该使用“keypress”事件代替。此事件在keydown/up之后触发,并在event.which或event.charCode中报告所键入的字符的实际Unicode代码点,在上面的示例中为十进制1078或U+0436。
因此,如果您不想猜测键盘布局并且不需要区分keyup/keydown,则keypress可能是一个可行的选择。它不是完美的(大多数浏览器不会在像修改键、功能键和导航键等不打印字符的键上始终报告keypress事件),但比猜测可打印字符的keycode要好。
键盘布局没有标准化的标识符。它们由布局创建者分配名称。它们可能具有语言关联作为一个定义的属性。
键盘布局不应与语言或区域设置标识符混淆。特别地,没有单一的“英语布局”,而是有数十种可用于英语的布局。
我认为系统通常不会通过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;
}
});
以下是未知下投票者的实际演示DEMO!
在正则表达式模式re
中,您可以添加任何缺失的特殊字符,例如#,`,|等。
\s
以包括空格。 - SaidbakRAccept-Language: de,en;q=0.7,en-us;q=0.3
,尽管我的键盘设置为de-ch
(特殊字符与普通的de-de
不同)。是否没有直接获取布局的方法? - Parzifal