2010-10-20 50 views

Respuesta

45

Nota: En retrospectiva, esta fue una respuesta rápida y sucia, y puede no funcionar en todas las situaciones. Para tener una solución fiable, véase Tim Down's answer (pegar copia que aquí como esta respuesta todavía está recibiendo puntos de vista y upvotes):

No se puede hacer esto de forma fiable con el evento keyup. Si desea saber algo sobre el carácter que se tipeó, debe usar el evento de pulsación de tecla en lugar de .

El siguiente ejemplo va a funcionar todo el tiempo en la mayoría de los navegadores, pero hay algunos casos extremos que se debe tener en cuenta. Para lo que está en mi opinión es la guía definitiva sobre esto, vea http://unixpapa.com/js/key.html.

$("input").keypress(function(e) { 
    if (e.which !== 0) { 
     alert("Charcter was typed. It was: " + String.fromCharCode(e.which)); 
    } 
}); 

keyup y keydown le dará información acerca de la clave física que se ha pulsado. En los teclados estándar de EE. UU./RU en sus diseños estándar, parece que existe una correlación entre la propiedad keyCode de estos eventos y el carácter que representan. Sin embargo, esto no es confiable en : diferentes diseños de teclado tendrán diferentes asignaciones.


La siguiente era la respuesta original, pero no es correcto y no funcione correctamente en todas las situaciones.

para que coincida con el código de tecla con un carácter de palabra (por ejemplo., a coincidirían. space no lo haría)

$("input").keyup(function(event) 
{ 
    var c= String.fromCharCode(event.keyCode); 
    var isWordcharacter = c.match(/\w/); 
}); 

Ok, eso fue una respuesta rápida. El enfoque es el mismo, pero tenga cuidado con los problemas del código clave; consulte este article en el modo peculiar.

+1

en Firefox keyCode para la tecla F1 y las teclas P es igual (también F2 es 'q', F3 es 'r', etc.). En Chromium (navegador Webkit) F1 es 'P', F2 es 'Q', etc. – hluk

+5

No se puede obtener el carácter tipeado confiablemente del evento 'keyup'. Esto puede funcionar en su teclado, pero para diferentes tipos de teclado y diferentes culturas no hay garantías en absoluto. –

+3

Si el punto de @ TimDown no era lo suficientemente claro, aquí hay otro: ** esta es básicamente la respuesta incorrecta **. – Christian

4

Si sólo necesita excluir a cabo enter, escape y spacebar teclas, puede hacer lo siguiente:

$("#text1").keyup(function(event) { 
if (event.keyCode != '13' && event.keyCode != '27' && event.keyCode != '32') { 
    alert('test'); 
    } 
}); 

See it actions here.

se puede hacer referencia a la complete list of keycode here para su posterior modificación.

+2

no incorpora clave o cambiar o Esc o espacio ... ((((((etc)))))) – faressoft

92

No se puede hacer esto de manera confiable con el evento keyup. Si desea saber algo sobre el carácter que se tipeó, debe usar el evento keypress en su lugar.

El siguiente ejemplo funcionará todo el tiempo en la mayoría de los buscadores, pero hay algunos casos extremos que debe tener en cuenta. Para lo que en mi opinión es la guía definitiva sobre esto, vea http://unixpapa.com/js/key.html.

$("input").keypress(function(e) { 
    if (e.which !== 0) { 
     alert("Charcter was typed. It was: " + String.fromCharCode(e.which)); 
    } 
}); 

keyup y keydown le dará información acerca de la clave física que se presionó. En los teclados estándar de EE. UU./RU en sus diseños estándar, parece que hay una correlación entre la propiedad keyCode de estos eventos y el carácter que representan. Sin embargo, esto no es confiable: diferentes diseños de teclado tendrán diferentes asignaciones.

+0

Acabo de encontrar un problema similar, donde * no * pude detectar y deshabilitar la tecla ENTRAR con 'keyup', pero I * era * capaz de hacer esto con' keypress'. –

+1

@IanCampbell '' 'keydown'' también habría funcionado. Es porque con '' 'keyup''' el botón enter ya se ha pulsado y recibido antes de que la tecla se haya levantado. –

+0

El evento de pulsación de tecla no es completamente confiable. En Chrome, si resaltas un personaje y escribes un nuevo carácter sobre él, no se activa ningún evento de pulsación de tecla. – danielson317

4

que quería hacer exactamente esto, y pensé en una solución que involucra tanto la keyup y la pulsación de tecla eventos.

(no he probado en todos los navegadores, pero se utiliza la información recopilada en http://unixpapa.com/js/key.html)

Editar: volvió a escribir como un plugin de jQuery.

(function($) { 
    $.fn.normalkeypress = function(onNormal, onSpecial) { 
     this.bind('keydown keypress keyup', (function() { 
      var keyDown = {}, // keep track of which buttons have been pressed 
       lastKeyDown; 
      return function(event) { 
       if (event.type == 'keydown') { 
        keyDown[lastKeyDown = event.keyCode] = false; 
        return; 
       } 
       if (event.type == 'keypress') { 
        keyDown[lastKeyDown] = event; // this keydown also triggered a keypress 
        return; 
       } 

       // 'keyup' event 
       var keyPress = keyDown[event.keyCode]; 
       if (keyPress && 
        (((keyPress.which >= 32 // not a control character 
          //|| keyPress.which == 8 || // \b 
          //|| keyPress.which == 9 || // \t 
          //|| keyPress.which == 10 || // \n 
          //|| keyPress.which == 13 // \r 
          ) && 
         !(keyPress.which >= 63232 && keyPress.which <= 63247) && // not special character in WebKit < 525 
         !(keyPress.which == 63273)       && // 
         !(keyPress.which >= 63275 && keyPress.which <= 63277) && // 
         !(keyPress.which === event.keyCode && // not End/Home/Insert/Delete (i.e. in Opera < 10.50) 
          (keyPress.which == 35 || // End 
           keyPress.which == 36 || // Home 
           keyPress.which == 45 || // Insert 
           keyPress.which == 46 || // Delete 
           keyPress.which == 144 // Num Lock 
          ) 
          ) 
         ) || 
         keyPress.which === undefined // normal character in IE < 9.0 
         ) && 
        keyPress.charCode !== 0 // not special character in Konqueror 4.3 
        ) { 

        // Normal character 
        if (onNormal) onNormal.call(this, keyPress, event); 
       } else { 
        // Special character 
        if (onSpecial) onSpecial.call(this, event); 
       } 
       delete keyDown[event.keyCode]; 
      }; 
     })()); 
    }; 
})(jQuery); 
11

Esto ayudó para mí:

$("#input").keyup(function(event) { 
     //use keyup instead keypress because: 
     //- keypress will not work on backspace and delete 
     //- keypress is called before the character is added to the textfield (at least in google chrome) 
     var searchText = $.trim($("#input").val()); 

     var c= String.fromCharCode(event.keyCode); 
     var isWordCharacter = c.match(/\w/); 
     var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46); 

     // trigger only on word characters, backspace or delete and an entry size of at least 3 characters 
     if((isWordCharacter || isBackspaceOrDelete) && searchText.length > 2) 
     { ... 
+0

También funciona con copiar/pegar CTRL + C/CTRL + V. Condición muy simple: 'String.fromCharCode (e.keyCode) .match (/ \ w /) || e.keyCode === 8 || e.keyCode === 46' – fabdouglas

+0

Pequeño error aquí. Está utilizando 'String.fromCharCode', pero ingresando' event.keyCode'. Debería ser 'event.charCode'. Sin embargo, 'event.charCode' siempre es 0 para el evento keyUp (en Chrome, al menos). Esta respuesta es defectuosa Si inspecciona la variable 'c', verá que no equivale a la tecla que se presionó. – HankScorpio

6

no estoy totalmente satisfecho con las otras respuestas dadas. Todos tienen algún tipo de falla para ellos.

El uso de keyPress con event.which no es confiable porque no puede capturar un retroceso o una eliminación (como lo menciona Tarl). Usando keyDown (como en el de las respuestas de Tarl Niva y) es un poco mejor, pero la solución es defectuoso porque los intentos de utilizar event.keyCode con String.fromCharCode() (keyCode y charCode no son lo mismo!).

Sin embargo, lo que tenemos que hacer con el evento keydown o keyup es la clave real que se presionó (event.key). Por lo que puedo decir, cualquier key con una longitud de 1 es un carácter (número o letra) independientemente del teclado de idioma que está utilizando. Por favor corrígeme si eso no es verdad!

Luego está la respuesta muy larga de asdf. Eso podría funcionar perfectamente, pero parece excesivo.


Así que aquí hay una solución simple que capturará todos los caracteres, retrocede y elimina. (Nota: ya sea keyup o keydown funcionará aquí, pero no lo hará keypress)

$("input").keydown(function(e) { 

    var isWordCharacter = event.key.length === 1; 
    var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46); 

    if (isWordCharacter || isBackspaceOrDelete) { 

    } 
}); 
+3

Realmente no me gustó esta respuesta cuando la leí por primera vez, pero luego le di una oportunidad y funciona de maravilla. – gdpelican

Cuestiones relacionadas