2008-09-17 247 views
31

Estoy escribiendo una aplicación que, si el usuario devuelve el golpe, puede volver a enviar la misma información y estropear el flujo y la integridad de los datos. ¿Cómo lo desactivo para usuarios que están con y sin javascript activado?Deshabilitar el botón Atrás en el navegador

+40

Si estoy usando su sitio, el botón de retroceso sigue siendo mío. No te metas con lo que es mío ... ;-) – Shog9

+5

Esta es la pregunta incorrecta. Lo que debe hacer es diseñar la aplicación de modo que cuando se reenvía la información, la aplicación la reconozca y actúe de manera adecuada. – reinierpost

Respuesta

76

No es posible, por desgracia. Sin embargo, considere su modelo de navegación de aplicaciones. ¿Estás usando Post/Redirect/Get PRG Model? http://en.wikipedia.org/wiki/Post/Redirect/Get?

Este modelo es más compatible con el botón de retroceso que el modelo de devolución de datos.

+50

Nada triste por eso. –

+19

Punto válido. Solo estoy triste. ;) –

+0

Scott - ¿La capacidad de deshabilitar las barras de herramientas y hacer clic derecho en el menú IE específico entonces? He visto aplicaciones LOB que bloquean por completo la navegación, pero (una vez más, lamentablemente) también requieren que el usuario tenga IE. –

12

No deberías.

Puede adjuntar un script al evento onbeforeunload de una página y confirmar con el usuario que es lo que quiere hacer; y puede ir un poco más allá y intente a disable it pero, por supuesto, eso solo funcionará para los usuarios que tengan activado javascript. En su lugar, revise la reescritura de la aplicación para que no realice transacciones en cada envío de página, sino solo al final del proceso.

+0

Hmmm ... el evento onbeforeunload también se invoca cuando se navega fuera de la página porque el usuario simplemente va a otra página (no solo porque el usuario presiona el botón Atrás), y se llamará al script. –

0

Puede publicar los datos de cada formulario en una _NUEVA ventana. Esto desactivará el botón Atrás en cada ventana, pero sin javascript podría ser difícil forzar el anterior.

8

Le recomiendo a llegar a extremos heroicos para evitar que se rompa el botón de retroceso, es una forma segura de alienar a sus usuarios e incluso llegó a No. 1 en Jacob Neilsen's Top 10 Web Design Mistakes in 1999.

Quizás podría considerar más bien hacer la pregunta: "¿Cómo se puede evitar romper el botón Atrás para < insertar su escenario aquí >?"

Si la respuesta de Scott llega cerca de la marca, considere cambiar su flujo al modelo PRG. Si es algo más, da un poco más de detalles y ve cómo podemos ayudar.

+2

No dijo que quería "romper" el botón Atrás. Quiere evitar un error común en el que fallan los patrones de diseño de Ajax porque un usuario presiona "Atrás", que significa "Deshace lo que acabo de hacer con tu aplicación Ajax" y en su lugar obtiene "Retroceder una solicitud HTTP ambigua y arbitraria". – pcorcoran

+1

Para mí que solo dice "no quería romper el botón Atrás, solo quería romper el botón Atrás para evitar que se rompa". : S Es posible obtener AJAX/JavaScript y botones de retroceso para jugar bien, todo lo que sugiero es que esa sería la ruta que recomendaría seguir. –

5

mejor opción no es depender de las devoluciones de datos para controlar el flujo, sin embargo, si usted está atascado con ella (por ahora)

se puede usar algo como esto:

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(Now.AddSeconds(-1)); 
    Response.Cache.SetNoStore(); 
    Response.AppendHeader("Pragma", "no-cache"); 

Pronto se dará cuenta de que no funcionará en todos los navegadores, pero entonces se puede introducir un cheque en su código como:

if (Page.IsPostBack) 
{ 
     if (pageIsExpired()){ 
      Response.Redirect("/Some_error_page.htm"); 
     } 
     else { 
      var now = Now; 
      Session("TimeStamp") = now.ToString(); 
      ViewState("TimeStamp") = now.ToString(); 
     } 

    private boolean pageIsExpired() 
    { 
    if (Session("TimeStamp") == null || ViewState("TimeStamp") == null) 
     return false; 

    if (Session("TimeStamp") == ViewState("TimeStamp")) 
     return true; 

     return false; 
    } 

que va a resolver un problema hasta cierto punto, código no verificado - sólo para los ejemplos de la pU rposes ..

3

Lo que viene para arriba con para desactivar el botón de retroceso podría no parar el botón Atrás en futuros navegadores.

Si está avanzado en el ciclo de desarrollo, le sugiero que pruebe algunas sugerencias anteriores pero cuando tenga tiempo debe estructurar su flujo para que el botón Atrás no interfiera con la lógica de su sitio, simplemente lleva al usuario de nuevo a la página anterior como esperan que haga.

7

Se me ocurrió un pequeño truco que desactiva el botón Atrás usando JavaScript.He comprobado en el cromo 10, Firefox 3.6 y IE9:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<title>Untitled Page</title> 
<script type = "text/javascript" > 
function changeHashOnLoad() { 
    window.location.href += "#"; 
    setTimeout("changeHashAgain()", "50"); 
} 

function changeHashAgain() { 
    window.location.href += "1"; 
} 

var storedHash = window.location.hash; 
window.setInterval(function() { 
    if (window.location.hash != storedHash) { 
     window.location.hash = storedHash; 
    } 
}, 50); 


</script> 
</head> 
<body onload="changeHashOnLoad(); "> 
Try to hit back! 
</body> 
</html> 
+1

Eso es desagradable ... – Soumya

+3

Pero funciona: adelante y pruébelo. –

+1

No lo dudo. Es solo una mala experiencia para el usuario, que en realidad puede * querer * regresar. – Soumya

0

yo era capaz de lograr esto mediante el uso de:

Response.Cache.SetExpires(DateTime.MinValue); 
Response.Cache.SetNoStore(); 

Cuando solía Response.Cache.SetCacheability (HttpCacheability.NoCache); me impidió descargar archivos de Office.

1

Es cierto, se debe agregar una validación adecuada para garantizar que los datos duplicados no estropeen las cosas. Sin embargo, como en mi caso, no controlo completamente los datos ya que estoy usando API de terceros después de mi formulario. Así que he usado este

history.go(+1); 

Esto enviará usuario con interés la "recepción", que se supone que vienen tras página "pago" si tratan de volver a la página de "pago" (sólo dar un pago, por ejemplo) . Usar con moderación, aunque

4

Es posible desactivar el botón atrás en todos los principales navegador. Simplemente usa valores hash para desactivar completamente el botón Atrás. sólo hay que poner estas 5 líneas de código en su página

<script> 
window.location.hash="no-back-button"; 
window.location.hash="Again-no-back-button";//for google chrome 
window.onhashchange=function(){window.location.hash="no-back-button";} 
</script> 

Detailed description

+0

Difícil ... pero funciona ... –

+0

@Ankit: Brilliant! ¡Salvó mi vida! ¡¡¡Gracias!!! – Emma

+0

no funciona correctamente en todos los casos, es decir, cromo, safari. –

Cuestiones relacionadas