2012-01-08 61 views
7

我在這裏查過其他問題,但他們不回答我的問題。我想簡單地捕捉某個keyCode並用另一個替換它。我正在使用字符,而不是空白,而且我不需要放鬆焦點等。如何捕獲event.keyCode並將其更改爲另一個keyCode?

以下是我的代碼。但是你可以用你的鍵代替(例如,當大寫字母「A」被按下時,它應該替換爲零,等等)。這個想法是取代keyCode。

phrase.keypress(function(event) 
{ 
    if (event.shiftKey) 
    { 
     switch (event.keyCode) 
     { 
      // Cyrillic capitalized "Н" was pressed 
      case 1053: event.keyCode = 1187; event.charCode = 1187; event.which = 1187; break; 
      // Cyrillic capitalized "О" was pressed 
      case 1054: event.keyCode = 1257; event.charCode = 1257; event.which = 1257; break; 
      // Cyrillic capitalized "У" was pressed 
      case 1059: event.keyCode = 1199; event.charCode = 1199; event.which = 1199; break; 
     } 
    } 
}); 

我試着用的keydown和KEYUP爲好。它們不會改變keyCode。我怎樣才能做到這一點?

P.S.如果可能,我正在尋找一個解決方案,它不會「event.preventDefault()並手動將所需的鍵插入輸入字段,然後將光標移動到末尾」。我想要更清潔和「正確」的解決方案。謝謝。

回答

6

鍵盤事件屬性都是隻讀的。您無法捕獲一個keyCode並將其更改爲另一個。

請參閱參考MDN - Keyboard Events - 所有隻讀無法設置。

正如你在你的文章中提到的。 - 如果你不想處理,那麼你必須停止瀏覽器默認按鍵,並自己設置所需的值。

+0

謝謝。現在我知道它們是隻讀的。我實施了「手動」解決方案。 – Eye 2012-01-08 10:18:54

+0

只是可能有幫助的東西。我發佈在「哪些」代碼的jQuery論壇上的列表。可能對你有幫助。如果沒有,可能對在此遇到的其他人有幫助。 http://forum.jquery.com/topic/eventwhich-code-list-just-for-help – SpYk3HH 2012-01-13 17:27:43

2

我正在使用以下代碼來實現相同的結果,如果我更改了keyCode,但實際上無法更改它。

function inputValidation() { 
    var srcField = event.srcElement; 
    var sKey = event.keyCode; 
    var inputLetter = String.fromCharCode(sKey); 
    if (typeof(srcField) !== "undefined" && srcField !== null) { 
     inputLetter = transformInput(inputLetter); 
     var caretPos = srcField.selectionStart; 
     var startString = srcField.value.slice(0, srcField.selectionStart); 
     var endString = srcField.value.slice(srcField.selectionEnd, srcField.value.length); 
     srcField.value = startString + inputLetter + endString; 
     setCaretPosition(srcField, caretPos+1); // '+1' puts the caret after the input 
     event.preventDefault ? event.preventDefault() : event.returnValue = false; //for IE8 
    } 
} 

srcField.selectionStart賦予文字的起始位置,你選擇和srcField.selectionEnd給出了選擇的結束位置,如果你還沒有選擇任何文本srcField.selectionStart等於srcField.selectionEnd

功能setCaretPosition來自this answer kd7。我只是改變它使它接收元素而不是它的Id

function setCaretPosition(elem, caretPos) { 
    if (elem != null) { 
     if (elem.createTextRange) { 
      var range = elem.createTextRange(); 
      range.move('character', caretPos); 
      range.select(); 
     } else { 
      if (elem.selectionStart) { 
       elem.focus(); 
       elem.setSelectionRange(caretPos, caretPos); 
      } else 
       elem.focus(); 
     } 
    } 
} 
相關問題