2010-08-16 36 views
8

Actualmente estoy usando el complemento jquery-form-observe que utiliza onbeforeunload para avisar al usuario sobre cambios "no guardados".¿Es posible activar el evento onbeforeunload programmatically?

Pero tengo un escenario en el que necesito activar esto con un clic de botón: el clic de botón finalmente lleva a cambiar la página, pero quiero pedirle al usuario que inicie el proceso que el clic del botón inicia.

Entonces, ¿hay alguna forma de activar antes de descargar a través de jQuery o de otra forma?

Respuesta

3

No sé si hay una forma directa de hacerlo, pero siempre puede emular la caja de confirmación del navegador usted mismo. He aquí una función simple que cociné hasta basada en la specs at MSDN: Editar

function triggerBeforeUnload() { 
    var event = {}; 
    handler(event); 

    if (typeof event.returnValue == 'undefined' || 
     confirm('Are you sure you want to navigate away from this page?\n\n' + event.returnValue + '\n\nPress OK to continue, or Cancel to stay on the current page.')) { 
    // Continue with page unload 
    } else { 
    // Cancel page unload 
    } 
} 

: En jquery.formobserver.js, justo después de la definición de function beforeunload(e) { ... }, añada esta línea:

handler = beforeunload; 

en cuenta el cambio en el original código: window.onbeforeunload ha sido reemplazado por handler.

+0

En tanto en Firefox e IE8 me sale un error en la llamada a window.onbeforeunload. El error de Firefox es "window.onbeforeunload no es una función" y IE vuelve con "Object no admite esta propiedad o método" – mutex

+0

Ok, entonces el problema es que el complemento conecta un controlador de eventos a través de 'addEventListener' /' attachEvent' y no directamente a través de 'window.onbeforeunload'. Supongo que tendrás que modificar el código del complemento para obtener una referencia a la función 'beforeunload'. – casablanca

+0

Gracias!Eso funciona ahora. ¿Alguna sugerencia sobre evitar el uso de un global para controlador, sin embargo? – mutex

2

Puede hacerlo con el método .trigger():

$('button').click(function(){ 
    $(window).trigger('beforeunload'); 
}); 
+3

Eso fue más o menos lo primero que probé, pero parece que el disparador no puede usarse en 'beforeunload' ya que no parece que nada suceda cuando lo llamo. – mutex

+0

@mutex Me preguntaba lo mismo antes de responder, así que configuré esta prueba simple: http://jsfiddle.net/LpGq9/. Quizás tiene que ver con la forma en que el complemento de observar formulario está vinculando al controlador de eventos onbeforeunload. – Pat

+0

Sí, probablemente tengas razón. El complemento no usa bind; en su lugar, hace esto: if (window.attachEvent) { window.attachEvent ('onbeforeunload', beforeunload); } else if (window.addEventListener) { window.addEventListener ('beforeunload', beforeunload, true); } – mutex

1

me encontré con esta pregunta durante la búsqueda de respuestas a mi propia pregunta que fue similar en naturaleza. Entonces, he encontrado una solución aquí. Necesitaba llamar a "antes de la descarga" solo cuando un usuario hace clic en un botón específico y ninguno de los demás. Espero que esto arroje algo de luz sobre tu pregunta.

Lo tengo para trabajar en jsfiddle. Puede probarlo allí en la demostración que he configurado, y puede ver claramente que solo funciona con uno de los botones. Sin embargo, hay una advertencia, para la cual no me he molestado en buscar una solución. Si hace clic en el botón y elige permanecer en la página, todos los botones/enlaces/redirecciones/recargas subsiguientes activarán "onbeforeunload". Puede hacer su propio trabajo para solucionar el "error" (por falta de mejor). términos) para que no cause esa reacción si el usuario decide permanecer en la página. Sin embargo, está funcionando y realiza lo que usted solicitó en el entorno de prueba.

Aquí está el código:

$(document).ready(function() { 
     $('.testButton').click(function() { 
      window.onbeforeunload = function() { 
       return "Enter your message here..."; 
      } 
     }); 
    }); 

EDIT:

Así, después de investigar otras maneras de hacer la misma cosa, me he encontrado otra manera de atar un evento para el botón usando .on de jQuery() método. El código se puede ver here, verifique que el código anterior esté comentado. De nuevo, el mismo "error" que antes, pero aún proporciona la funcionalidad que se solicitó.

Aquí está la alternativa:

$(document).ready(function() { 
     $('.testButton').on("click", function (event) { 
      window.onbeforeunload = function() { 
       return "Enter your message here..."; 
      } 
     }); 
    }); 
Cuestiones relacionadas