2009-08-19 11 views
64

¿Alguien sabe cómo evitar que una página se recargue o navegue?¿Cómo impido que una página se descargue (navegue) en JS?

jQuery(function($) { 

    /* global on unload notification */ 
    warning = true; 

    if(warning) { 
     $(window).bind("unload", function() { 
      if (confirm("Do you want to leave this page") == true) { 
       //they pressed OK 
       alert('ok'); 
      } else { 
       // they pressed Cancel 
       alert('cancel'); 
       return false; 
      } 
     }); 
    } 
});

estoy trabajando en un sitio de comercio electrónico en el momento, la página que muestra sus futuros pedidos tiene la capacidad de alterar las cantidades de artículos pedidos utilizando los botones +/-. Cambiar las cantidades de esta manera esto no cambia realmente el orden en sí, tienen que presionar confirmar y por lo tanto, comprometer una acción positiva para cambiar el orden.

Sin embargo, si han cambiado las cantidades y navegado fuera de la página, les advierto que lo están haciendo en caso de que sea un accidente, ya que las cantidades modificadas se perderán si navegan o actualizan la página.

En el código anterior, estoy usando una variable global que será falsa de manera predeterminada (solo es válido para las pruebas), cuando se cambie una cantidad, actualizaré esta variable para que sea verdadera, y cuando confirmen los cambios lo haré configurarlo en falso

Si la advertencia es cierta y la página está descargada, les ofrezco un cuadro de confirmación, si dicen que no les gustaría permanecer en esta página, necesito detener la descarga. return false no funciona, aún permite al usuario navegar (las alertas solo están disponibles para la depuración)

¿Alguna idea?

+0

relacionados: http://stackoverflow.com/q/821011/435605 –

Respuesta

19

desea utilizar el evento onbeforeunload.

+0

@scunliffe - en 'descarga' jQuery significa 'onbeforeunload', eso es lo que está haciendo. – karim79

+17

@ karim79: no, no es así. No hay nada en jQuery que se una a la función de carga previa; "descargar" se une al evento "descargar". Busca en la fuente si no me crees ;-) – NickFitz

-5

Intente usar e.preventDefault() en lugar de devolver falso. 'e' sería el primer argumento para su descarga devolución de llamada.

+0

@MathieuK - He votado como creo que tienes razón, pero probablemente deberías 1) poner un ejemplo o 2) modificar el código en la pregunta para incorporar su sugerencia antes de que alguien más aparezca y lo haga;) – karim79

+14

preventDefault no tendrá ningún efecto en el evento de descarga: no es posible que un script cancele la descarga, ya que eso permitiría que un sitio malicioso secuestrara la ventana del navegador. – NickFitz

+0

preventdefault no está implementado en el evento de descarga –

81

onbeforeunload es el que desea; su función "debe asignar un valor de cadena a la propiedad returnValue del objeto Event y devolver la misma cadena". Consulte los documentos de Microsoft y Mozilla para obtener más información.

La cadena que devuelva será utilizada por el navegador para presentar al usuario un cuadro de confirmación personalizado, lo que le permite negarse a permanecer allí si así lo desea. Tiene que hacerse de esa manera para evitar que los guiones maliciosos causen un ataque de denegación de navegador.

+3

Debe tenerse en cuenta que si está utilizando jQuery para enlazar el evento, debe enlazar a 'beforeunload' (dejar fuera de la sección' on' de la cadena) – jgillman

4
window.onbeforeunload = function() { 
    if (warning) { 
    return 'You have made changes on this page that you have not yet confirmed. 
    If you navigate away from this page you will loose your unsaved changes'; 
    } 
} 

No lo apoyamos en Chrome, Safari y Opera

+4

No es compatible con ¿Cromo? Estoy bastante seguro de que SO me presenta un diálogo así cuando ingresé algo en el editor (estoy usando Chrome 4.0.206.0 en Linux) –

65

Este código advierte según la sugerencia de Natalie, pero desactiva el aviso si se envía un formulario de la página. Utiliza JQuery.

var warning = true; 
window.onbeforeunload = function() { 
    if (warning) { 
    return "You have made changes on this page that you have not yet confirmed. If you navigate away from this page you will lose your unsaved changes"; 
    } 
} 

$('form').submit(function() { 
    window.onbeforeunload = null; 
}); 
+7

Completamente pasa por alto el punto de la variable de advertencia. – meandmycode

+9

¿Por qué el voto a favor? Respondí y agregué al tema. La variable de advertencia está ahí para ilustrar una prueba de concepto. Desactívelo o quítelo. Estoy seguro de que la mayoría de los usuarios no copiarán código textualmente de este sitio y lo usarán tal cual. – crafter

+7

Supongo que el voto a favor se debe a que estableces la variable de advertencia y luego no la utilizas en tu función de envío, p. simplemente use 'warning = false' en lugar de' window.onbeforeunload = null' –

4
window.onbeforeunload = confirmExit; 
function confirmExit() 
{ 
    return "You have attempted to leave this page. If you have made any changes to the fields without clicking the Save button, your changes will be lost. Are you sure you want to exit this page?"; 
} 
Cuestiones relacionadas