2012-01-17 78 views
13

有什么方法可以检测到使用JavaScript的当前键盘布局吗?我发现this, 但它只检测访问者是否在英文版面上。我需要知道字符串的确切布局,例如de-chfren用javascript检测键盘布局

+0

你找到答案? – yanivsh 2015-05-18 09:48:41

回答

11

键盘布局没有标准化的标识符。他们的名称由布局创建者分配给他们。他们可能有一个语言协会作为一个明确的财产。

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

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

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

+0

很好的答案,谢谢。我将寻找解决这个问题的另一种方法。 – Parzifal 2012-01-17 10:47:20

3

您正在寻找的是如何检测其区域设置。在HTTP标头中,它存储在Accept-Language标题中,但浏览器无法通过纯JS获得。

有一个名为'Browser Language'的jQuery插件可能会让你走上正确的道路。

+2

Accept-Language,浏览器语言(这有几个meaninigs)和键盘布局都是不同的东西。你最多可以猜测出其他人的键盘语言,你经常会猜错。 – 2012-01-17 09:41:14

+0

感谢您的回答!这对大多数访问者都适用,但有些人的键盘布局与接受语言不同。例如,虽然我的键盘设置为“de-ch”,但我的头文件是'Accept-Language:de,en; q = 0.7,en-us; q = 0.3'(特殊字符与普通的'de-de'不同)。有没有直接的方式来获得布局? – Parzifal 2012-01-17 09:42:34

+2

没有办法获得布局,只能根据语言进行猜测。是的,如果是Querty vs. Divorak或中国传统vs.中文简体 - 你可能无法确定它。在第二个想法..我意识到,它可能是可能的检测,但..它会是斑点。您基本上必须等待用户输入内容,然后检查关键代码。 – synthesizerpatel 2012-01-17 09:45:25

13

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

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

但是,如果您对由按键导致的角色更感兴趣,则应该使用“按键”事件。此事件在keydown/up后触发,并报告在event.which或event.charCode内键入的字符的实际unicode代码点,在上例中为十进制1078或U + 0436。

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

+6

“,事件报告186作为他们两人的代码。”我认为这是错误的。试试这个小提琴http://jsfiddle.net/BWPaz/并尝试在不同的键盘区域设置之间切换。我个人在英语的美国语言环境中获得与法语语言环境不同的代码。 – 2013-07-13 17:41:23

+1

@JackM对于位于同一个键上的不同俄文和英文符号,我得到的键码相同。 Chrome,Windows 8.1。 – 2016-04-04 10:16:29

1

我对这个主题的所有了解以及已经实施的解决方案都是检测非英文版式键盘,即使用英文以外的任何字母表。该解决方案取决于正则表达式以匹配任何单词字符\w,任何数字字符\d和一系列预定义的英文键盘特殊字符,因此任何其他字符(如阿拉伯语,日语等)都不匹配,所有这些都使用keydown事件和我正在使用此解决方案以登录表限制并通知用户名和密码字段条目。我包装它像一个函数如下:

function checkKeyboard(ob,e){ 
     re = /\d|\w|[\.\[email protected]\*\\\/\+\-\^\!\(\)\[\]\~\%\&\=\?\>\<\{\}\"\'\,\:\;\_]/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; 
     } 
    });