En IE puedo hacer esto con el jQuery (terriblemente no estándar, pero que funciona)
if ($.browser.msie)
$(document).keydown(function(e) { if (e.keyCode == 8) window.event.keyCode = 0;});
¿Pero es posible hacerlo de una manera que funcione en Firefox, o en una forma de navegador cruzado para obtener una bonificación?
Para el registro:
$(document).keydown(function(e) { if (e.keyCode == 8) e.stopPropagation(); });
no hace nada.
$(document).keydown(function(e) { if (e.keyCode == 8) e.preventDefault(); });
resuelve el problema, pero hace que la tecla de retroceso no se pueda usar en la página, lo que es aún peor que el comportamiento original.
EDITAR: La razón por la que hago esto es que no estoy creando una página web simple sino una aplicación grande. Es increíblemente molesto perder 10 minutos de trabajo solo porque presionó la tecla de retroceso en el lugar equivocado. La proporción de prevención de errores frente a usuarios molestos debería estar muy por encima de 1000/1 al evitar que la tecla de retroceso navegue hacia atrás.
Edit2: Soy no tratar de evitar que el historial de navegación, los accidentes solo.
EDITAR3: comentario de @brentonstrines (movido aquí ya que la pregunta es muy popular): Esta es una 'solución' a largo plazo, pero podría brindar su apoyo detrás del error Chromium para cambiar este comportamiento en el kit web
fuente
Respuestas:
Este código resuelve el problema, al menos en IE y Firefox (no he probado ningún otro, pero le doy una posibilidad razonable de funcionar si el problema incluso existe en otros navegadores).
fuente
d.type.toUpperCase() === 'PASSWORD'
también. De lo contrario, se ve bienif( $(d).is( ":input" ) )...
d.isContentEditable
aquí.Este código funciona en todos los navegadores y se traga la tecla de retroceso cuando no está en un elemento de formulario, o si el elemento de formulario está desactivado | readOnly. También es eficiente, lo cual es importante cuando se ejecuta en cada tecla ingresada.
fuente
if(!rx.test(e.target.tagName) || $(e.target).is(':checkbox') || $(e.target).is(':radio') || $(e.target).is(':submit') || e.target.disabled || e.target.readOnly )
contentEditable
..is(':checkbox,:radio,:submit')
Las otras respuestas aquí han establecido que esto no se puede hacer sin elementos de la lista blanca en los que se permite Retroceso. Esta solución no es ideal porque la lista blanca no es tan sencilla como simplemente las áreas de texto y las entradas de texto / contraseña, pero se encuentra repetidamente incompleta y necesita actualizarse.
Sin embargo, dado que el propósito de suprimir la funcionalidad de retroceso es simplemente para evitar que los usuarios pierdan datos accidentalmente, la solución beforeunload es buena porque la ventana emergente modal es sorprendente: las ventanas emergentes modales son malas cuando se activan como parte de un flujo de trabajo estándar, porque el usuario se acostumbra a descartarlos sin leerlos, y son molestos. En este caso, la ventana emergente modal solo aparecería como una alternativa a una acción rara y sorprendente, y por lo tanto es aceptable.
El problema es que un modal onbeforeunload no debe aparecer cuando el usuario navega fuera de la página (como cuando hace clic en un enlace o envía un formulario), y no queremos comenzar a incluir en la lista blanca o en una lista negra las condiciones específicas de onbeforeunload.
La combinación ideal de compensaciones para una solución generalizada es la siguiente: realizar un seguimiento de si se presiona la tecla de retroceso y solo aparece el modo onbeforeunload si es así. En otras palabras:
Esto ha sido probado para funcionar en IE7 +, Firefox, Chrome, Safari y Opera. Simplemente suelte esta función en su global.js y llámela desde cualquier página donde no desee que los usuarios pierdan accidentalmente sus datos.
Tenga en cuenta que un modal onbeforeunload solo se puede activar una vez, por lo que si el usuario presiona la tecla de retroceso nuevamente, el modal no volverá a activarse.
Tenga en cuenta que esto no se activará en eventos de cambio hash, sin embargo, en ese contexto, puede usar otras técnicas para evitar que los usuarios pierdan accidentalmente sus datos.
fuente
Una solución más elegante / concisa:
fuente
Modificación de la respuesta de erikkallen para abordar diferentes tipos de entrada
Descubrí que un usuario emprendedor podría presionar la tecla de retroceso en una casilla de verificación o un botón de radio en un vano intento de borrarlo y, en su lugar, navegaría hacia atrás y perdería todos sus datos.
Este cambio debería abordar ese problema.
Nueva edición para abordar contenido editable divs
Ejemplo
Para probar hacer 2 archivos.
starthere.htm: abre esto primero para que tengas un lugar al que volver
test.htm: se desplazará hacia atrás cuando se presione la tecla de retroceso mientras la casilla de verificación o el envío tienen el foco (logrado mediante tabulación). Reemplazar con mi código para arreglar.
fuente
Según los comentarios, parece que desea evitar que las personas pierdan información en los formularios, si presionan la tecla de retroceso para eliminar pero el campo no está enfocado.
En cuyo caso, desea ver el controlador de eventos onunload . Stack Overflow lo usa: si intenta salir de una página cuando comienza a escribir una respuesta, aparece una advertencia.
fuente
¡Deja de navegar este código funciona!
Pero para no restringir campos de texto pero otros
Para evitarlo para un campo específico, simplemente use
En referencia a este a continuación!
Evite que BACKSPACE vuelva a navegar con jQuery (como la página de inicio de Google)
fuente
La mayoría de las respuestas están en jquery. Puede hacerlo perfectamente en Javascript puro, simple y no requiere biblioteca. Este artículo fue un buen punto de partida para mí, pero dado que keyIdentifier está en desuso, quería que este código fuera más seguro, así que agregué || e.keyCode == 8 a la instrucción if. Además, el código no funcionaba bien en Firefox, así que agregué return false; y ahora funciona perfectamente bien Aquí está:
Este código funciona muy bien porque,
fuente
Combinando soluciones dadas por "thetoolman" && "Biff MaGriff"
El siguiente código parece funcionar correctamente en IE 8 / Mozilla / Chrome
fuente
No estoy seguro de por qué nadie acaba de responder esto: parece una pregunta técnica perfectamente razonable para preguntar si es posible.
No, no creo que haya una forma de navegador cruzado para desactivar el botón de retroceso. Sin embargo, sé que no está habilitado de forma predeterminada en FF en estos días.
fuente
Me costó encontrar una respuesta que no fuera de JQUERY. Gracias a Stas por ponerme en la pista.
Cromo: si no necesita soporte para varios navegadores, puede usar una lista negra, en lugar de una lista blanca. Esta versión JS pura funciona en Chrome, pero no en IE. No estoy seguro acerca de FF.
En Chrome (ver. 36, mediados de 2014), las pulsaciones de teclas que no están en una entrada o elemento contento parecen estar dirigidas a
<BODY>
. Esto hace posible usar una lista negra, que prefiero incluir en la lista blanca. IE usa el objetivo del último clic, por lo que puede ser un div o cualquier otra cosa. Eso hace que esto sea inútil en IE.Cross Browser: para javascript puro, encontré que la respuesta de Stas es la mejor. Agregar una verificación de condición más para contenteditable lo hizo funcionar para mí *:
* Tenga en cuenta que los IE [edit: y Spartan / TechPreview] tienen una "característica" que hace que los elementos relacionados con la tabla no sean editables . Si hace clic en uno de ellos y ENTONCES presiona la tecla de retroceso, navegará hacia atrás. Si no tiene correos editables
<td>
, esto no es un problema.fuente
Esta solución es similar a otras que se han publicado, pero utiliza una lista blanca simple que lo hace fácilmente personalizable para permitir el retroceso en elementos específicos simplemente configurando el selector en la función .is ().
Lo uso en este formulario para evitar que el espacio de retroceso en las páginas navegue hacia atrás:
fuente
Para explicar un poco la excelente respuesta de @ erikkallen , aquí hay una función que permite todos los tipos de entrada basados en el teclado, incluidos los introducidos en HTML5 :
fuente
JavaScript - forma jQuery:
Javascript: la forma nativa que funciona para mí:
fuente
Tuve algunos problemas con la solución aceptada y el complemento Select2.js; No pude eliminar caracteres en el cuadro editable ya que se estaba evitando la acción de eliminar. Esta fue mi solución:
Select2 crea un Span con un atributo de "contentEditable" que se establece en verdadero para el cuadro combinado editable en él. Agregué código para tener en cuenta el nombre de etiqueta y el atributo diferente. Esto resolvió todos mis problemas.
Editar: si no está utilizando el complemento de cuadro combinado Select2 para jquery, es posible que no necesite esta solución y que la solución aceptada sea mejor.
fuente
fuente
Este código resuelve el problema en todos los navegadores:
fuente
DIV
oTD
.La forma más sencilla de evitar la navegación al presionar la tecla de retroceso
fuente
Usando Dojo toolkit 1.7, esto funciona en IE 8:
fuente
¿Ha probado la solución muy simple de simplemente agregar el siguiente atributo a su campo de texto de solo lectura:
onkeydown = "return false;"
Esto evitará que el navegador regrese al historial cuando se presione la tecla Retroceso en un campo de texto de solo lectura. Tal vez me estoy perdiendo tu verdadera intención, pero parece que esta sería la solución más simple para tu problema.
fuente
Una solución mucho más ordenada:
Alternativamente, solo puede verificar si
fuente
Versión javascript pura, que funciona en todos los navegadores:
Por supuesto, puede usar "INPUT, TEXTAREA" y luego "if (! Regex.test (elements))". El primero funcionó bien para mí.
fuente
¿Actuación?
Estaba preocupado por el rendimiento e hice un violín: http://jsfiddle.net/felvhage/k2rT6/9/embedded/result/
He analizado los métodos más prometedores que encontré en este hilo. Resulta que todos fueron muy rápidos y probablemente no causen problemas en términos de "lentitud" al escribir. El método más lento que miré fue de aproximadamente 125 ms para 10.000 llamadas en IE8. Que es 0.0125ms por golpe.
Encontré que los métodos publicados por Codenepal y Robin Maben son más rápidos ~ 0.001ms (IE8) pero tenga cuidado con las diferentes semánticas.
Quizás esto sea un alivio para alguien que introduce este tipo de funcionalidad en su código.
fuente
Respuesta erikkallen modificada:
fuente
Esta solución funcionó muy bien cuando se probó.
Agregué un código para manejar algunos campos de entrada no etiquetados con entrada, y para integrarlo en una aplicación Oracle PL / SQL que genera un formulario de entrada para mi trabajo.
Mis dos centavos":
fuente
Creé un proyecto NPM con una versión limpia del actualmente aceptado (de erikkallen)
https://github.com/slorber/backspace-disabler
Utiliza básicamente los mismos principios pero:
fuente
Aquí está mi reescritura de la respuesta más votada. Traté de verificar element.value! == undefined (ya que algunos elementos como pueden no tener atributo html pero pueden tener una propiedad de valor de JavaScript en algún lugar de la cadena del prototipo), sin embargo, eso no funcionó muy bien y tenía muchos casos extremos. No parece haber una buena manera de hacer esto a prueba del futuro, por lo que una lista blanca parece la mejor opción.
Esto registra el elemento al final de la fase de burbuja de eventos, por lo que si desea manejar Retroceso de cualquier manera personalizada, puede hacerlo en otros controladores.
Esto también verifica la instancia de HTMLTextAreElement, ya que uno podría teóricamente tener un componente web que hereda de eso.
Esto no verifica el contenido Editable (combinar con otras respuestas).
https://jsfiddle.net/af2cfjc5/15/
fuente
Sitepoint: desactivar de nuevo para Javascript
event.stopPropagation()
yevent.preventDefault()
no hacer nada en IE. Sin embargo, tuve que enviar la devoluciónevent.keyCode == 11
(solo elegí algo) en lugar de solo decir"if not = 8, run the event"
que funcionara.event.returnValue = false
También funciona.fuente
Otro método usando jquery
fuente
He estado usando esto en mi código por algún tiempo. Escribo pruebas en línea para estudiantes y me encontré con el problema cuando los estudiantes presionaron la tecla de retroceso durante su prueba y los llevaría de vuelta a la pantalla de inicio de sesión. ¡Frustrante! Funciona en FF seguro.
fuente