2012-01-08 3 views
7

私はここで他の質問をチェックしましたが、私の質問には答えません。私は単純に特定のkeyCodeをキャッチし、別のkeyCodeで置き換えたいと思う。私は空白ではなく文字で作業しており、フォーカスなどを緩める必要はありません。event.keyCodeを捕捉して別のkeyCodeに変更するには?

以下は私のコードです。しかし、あなたはそれらのkeyCodeをあなたのものに置き換えることができます(例えば、大文字の "A"が押されたとき、0の0に置き換えられるときなど)。アイデアは、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

キーボードイベントのプロパティはすべて読み取り専用です。 1つのkeyCodeをキャプチャして別のkeyCodeに変更することはできません。

MDN-Keyboard Eventsからの参照を参照 - すべて読み取り専用です。設定できません。

投稿に記載されているとおりです。 - 処理したくない場合は、ブラウザのデフォルトのキー押下を止め、要素に必要な値を自分で設定する必要があります。

+0

ありがとうございます。今私はそれらが読み取り専用であることを知っています。そして、私はその "マニュアル"ソリューションを実装しました。 – Eye

+0

ちょっと役立つかもしれません。 "どの"コードのjqueryフォーラムに投稿したリスト。 yaに役立つかもしれません。もしそうでなければ、ここに来る誰かに助けになるかもしれません。 http://forum.jquery.com/topic/eventwhich-code-list-just-for-help – SpYk3HH

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.selectionStartsrcField.selectionEnd等しい任意のテキストを選択していない場合 srcField.selectionEndは、選択範囲の終了位置を示します。

setCaretPositionは、kd7によってthis answerから来ました。私は、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(); 
     } 
    } 
} 
関連する問題