2012-01-17 80 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; 
     } 
    });