2011-02-08 22 views
26

No parece que los métodos jQuery keyup, keydown o keypress se activen cuando se presiona la tecla de retroceso. ¿Cómo atraparía la presión de la tecla de retroceso?Cómo atrapar la tecla de retroceso con jQuery?

+0

Solo para aclarar, quiero interceptar cuando se presiona la tecla de retroceso y realizar una acción. Estoy cambiando el estado habilitado de algunos botones en la página cuando se elimina el último carácter de un cuadro de texto. Por lo tanto, todavía quiero que la tecla de retroceso realice su operación normal. – ChrisP

+1

Eso no es verdad. Aparece en los métodos keyup y keydown. Solo no aparece en presionar tecla. – Line

+0

@RickSmith No estoy de acuerdo. La pregunta a la que se refiere es en JavaScript, mientras que OP está preguntando en jQuery. Puede haber alguna razón por la que alguien quiera la respuesta de uno u otro método. –

Respuesta

61

prueba este:

$('html').keyup(function(e){if(e.keyCode == 8)alert('backspace trapped')}) 
+16

también verifica 46 (eliminar) – andufo

+0

Funciona, pero no se puede mostrar de esta manera la ventana modal y dejar de volver a la página anterior. –

+1

Pruebe e.preventDefault() y ENTONCES haga lo más dudoso :) –

10

Se puede usar javascript regular para atrapar la tecla de retroceso. Puede usar el método event.keyCode. El código clave es 8, por lo que el código sería algo como esto:

if (event.keyCode == 8) { 
    // Do stuff... 
} 

Si desea comprobar tanto para el [eliminar] (46), así como el [Retroceso] (8) teclas, utilice el siguiente :

if (event.keyCode == 8 || event.keyCode == 46) { 
    // Do stuff... 
} 
3

Trabajando en la misma idea que el anterior, pero generalizando un poco. Dado que el retroceso debería funcionar bien en los elementos de entrada, pero no debería funcionar si el foco es un párrafo o algo, ya que es allí donde la página tiende a volver a la página anterior en el historial.

$('html').on('keydown' , function(event) { 

     if(! $(event.target).is('input')) { 
      console.log(event.which); 
      //event.preventDefault(); 
      if(event.which == 8) { 
      // alert('backspace pressed'); 
      return false; 
     } 
     } 
}); 

return false => both event.preventDefault y event.stopPropagation están en vigor.

+0

upvote para Keydown en lugar de keyup. –

3

El comportamiento predeterminado para el retroceso en la mayoría de los navegadores es volver a la página anterior. Si lo hace no desea este comportamiento, necesita asegurarse de que la llamada preventDefault(). Sin embargo, como se mencionó al OP, si siempre lo llama al preventDefault(), también hará que sea imposible eliminar cosas en los campos de texto. El siguiente código tiene una solución adaptada de this answer.

Además, en lugar de usar valores de código clave codificados (algunos valores cambian según su navegador, aunque no he encontrado que esto sea cierto para Retroceso o Eliminar), jQuery has keyCode constants ya está definido. Esto hace que su código sea más legible y se ocupa de cualquier incoherencia de KeyCode por usted.

// Bind keydown event to this function. Replace document with jQuery selector 
// to only bind to that element. 
$(document).keydown(function(e){ 

    // Use jquery's constants rather than an unintuitive magic number. 
    // $.ui.keyCode.DELETE is also available. <- See how constants are better than '46'? 
    if (e.keyCode == $.ui.keyCode.BACKSPACE) { 

     // Filters out events coming from any of the following tags so Backspace 
     // will work when typing text, but not take the page back otherwise. 
     var rx = /INPUT|SELECT|TEXTAREA/i; 
     if(!rx.test(e.target.tagName) || e.target.disabled || e.target.readOnly){ 
      e.preventDefault(); 
     } 

     // Add your code here. 
    } 
}); 
+0

Esto maneja la mayoría de los casos, pero quiero evitar que vuelva a seleccionar y en ciertos tipos de entrada, como la radio o la casilla de verificación, así que eliminé 'SELECT' y agregué una prueba en' e.target.type'. Hasta ahora tengo estos tipos de entrada 'var rxt =/radio | botón | casilla de verificación | imagen | restablecer | enviar/i;' El color también puede ser uno para excluir, pero puede ser específico del navegador. – peater

Cuestiones relacionadas