2012-01-08 2 views
7

Ho controllato altre domande qui in SO, tuttavia non rispondono alla mia domanda. Voglio semplicemente prendere alcuni keyCode e sostituirlo con un altro. Sto lavorando con i personaggi, non con gli spazi bianchi, e non ho bisogno di perdere la concentrazione o simili.Come catturare event.keyCode e cambiarlo in un altro keyCode?

Di seguito è riportato il mio codice. Ma puoi sostituire questi codici chiave con il tuo (ad esempio quando viene premuto il capitale "A", dovrebbe essere sostituito con zero 0, ecc.). L'idea è di sostituire il codice chiave.

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; 
     } 
    } 
}); 

Ho provato anche con keydown e keyup. Non alterano il codice chiave. Come lo posso fare?

P.S. Se possibile, sto cercando una soluzione che non "event.preventDefault() e inserisca manualmente la chiave desiderata nel campo di input, quindi sposti il ​​cursore alla fine". Voglio una soluzione più pulita e "giusta". Grazie.

risposta

6

Le proprietà dell'evento tastiera sono tutte di sola lettura. Non puoi acquisire un codice chiave e cambiarlo in un altro.

Vedere riferimento da MDN - Keyboard Events - Tutti sono di sola lettura non possono essere impostati.

Come hai menzionato nel tuo post. - Se non si desidera gestire, è necessario interrompere la pressione del tasto predefinito del browser e impostare personalmente il valore desiderato per l'elemento.

+0

Grazie. Ora so che sono di sola lettura. E ho implementato quella soluzione "manuale". – Eye

+0

Solo qualcosa che potrebbe aiutare. Una lista che ho postato sui forum di jquery sui codici "which". Potrebbe esserti d'aiuto. se no, potrebbe essere utile a qualcun altro che si imbatte qui. http://forum.jquery.com/topic/eventwhich-code-list-just-for-help – SpYk3HH

2

Sto usando il seguente codice per ottenere lo stesso risultato come se avessi modificato lo keyCode, senza essere in grado di cambiarlo.

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 dà la posizione di partenza del testo che avete selezionato e srcField.selectionEnd dà la posizione finale della selezione, se non è stato selezionato alcun testo srcField.selectionStart uguale srcField.selectionEnd.

La funzione setCaretPosition proviene da this answer di kd7. Ho solo cambiato per farlo ricevere l'elemento invece del suo 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(); 
     } 
    } 
}