oct 12 2011

TRUCO: Cómo detectar el cierre o la salida de una página Web

by Jose M. AlarconCategorías: Desarrollo Web [Leer sin negritas]

Seguramente te has topado en algunas ocasiones con que, tras haber rellenado algunos campos de un formulario , algunas aplicaciones Web te avisan si pretendes cerrar la ventana o abandonar la página, ya que perderías los datos.

Yo por ejemplo utilizo bastante el webmail de Google, GMail, y muchas veces si acabo de enviar un correo y cierro muy rápido la ventana, como el correo aún no ha terminado de enviarse me avisa para evitar que se pierda.

¿Cómo es posible conseguir esto?

La verdad es que es muy sencillo y se consigue en la práctica totalidad de los navegadores modernos (excepto en Opera) gracias al evento onbeforeunload de la ventana del navegador.

Consideremos el siguiente ejemplo:

<html>
<head>
<title>Prueba de abandono de página</title>
<script language="JavaScript" type0"text/javascript">
     
    var bPreguntar = true;
     
    window.onbeforeunload = preguntarAntesDeSalir;
     
    function preguntarAntesDeSalir()
    {
      if (bPreguntar)
        return "¿Seguro que quieres salir?";
    }
</script>
</head>
<body>
<h1>Ejemplo de abandono de página</h1>
<p>Por defecto preguntará hasta que pulses el botón de "No preguntar"</p>
<input type="button" value="Preguntar" onclick="bPreguntar = true;" >
&nbsp;&nbsp;
<input type="button" value="No preguntar" onclick="bPreguntar = false;" >
<br/><br/>
<a href="http://www.jasoft.org">Ir a otra página</a>
</body>
</html>

Deja de lado el código JavaScript por un momento.

Como vemos se trata de una página muy sencilla. contiene una cabecera, un texto explicativo, dos botones y un enlace. Su aspecto es el siguiente:

AbandonoPagina_1

Hemos creado una variable booleana, bPreguntar, con el valor por defecto verdadero, de modo que servirá para controlar si debemos preguntarle o no al usuario si de verdad quiere abandonar la página (por defecto se lo preguntaremos).

Lo único que tenemos que hacer es interceptar el evento onbeforeunload de la ventana actual y asignarle un manejador apropiado, en este caso le h llamado preguntarAntesDeSalir.

Dentro de este evento el navegador controlamos si se debe preguntar por el abandono de la página o no. El navegador entiende que si como resultado de este evento pasamos una cadena de texto, deberá preguntarle al usuario con ella si quiere abandonar o no la página, mostrando el texto especificado, y dándole a elegir entre ambas opciones (dejar la página o no):

AbandonoPagina_2

Como vemos apenas podemos controlar el aspecto del diálogo, limitándose a mostrar el texto junto con otro texto estándar del propio navegador.

La única "pega" es precisamente que no seremos capaces de controlar el aspecto de este diálogo y que éste cambia además entre los diferentes navegadores (los tengo todos instalados en inglés):

AbandonoPagina_3

Como vemos Firefox hace caso omiso del texto que le hemos indicado y muestra un mensaje propio. Chrome/Safari e Internet Explorer muestran un mensaje estándar pero lo acompañan de nuestro texto para poder dar una información más detallada. Personalmente el diálogo que me parece más claro es el de Internet Explorer.

Este evento se definió por primera vez en Internet Explorer 4 (¡en 1997!), y los demás navegadores le fueron añadiendo soporte mucho más adelante. En la actualidad está soportado por todas las versiones modernas de los navegadores. Yo lo he probado con Internet Explorer 7, 8 y 9, con Firefox 4, 5, 6 y 7 y con Google Chrome. Debería funcionar perfectamente con Safari tanto en Windows como en Mac. Me consta que no funciona con Opera pero no lo he probado.

¡Espero que te resulte útil!

Tags:

Comentarios (10) -

1.
Carlos Sincuir Carlos Sincuir Guatemala dice:

Excelente Jose!!
Funciona muy bien, hasta intentado cerrar el navegador.
Esto me sera de mucha utilidad.

Saludos.

Carlos.

2.
Isidro Isidro Dominican Republic dice:

Muy útil,ya lo implemente en mi website

3.
Isidro Isidro Dominican Republic dice:

Para utilizando este código desde un ventana emergente(pop-up) modifique el codigo para que funcionara de esta manera

function redireccionar() {
                window.opener.location.href = "Default.aspx"
        }

en la etiqueta <body> se debe agregar el evento onbeforeunload="redireccionar()"
para que llame la funcion redireccionar.

lo que hace "window.opener.location.href" es llamar la ventana padre del pop-up
de la cual se abrio el la ventana, espero me allá explicado bien , saludos

4.
camilo camilo Colombia dice:

Esto lo he provado, pero no funciona, solo funciona cuando la pagina esta con ajax totalmente.

5.
Jos&#233; Manuel Alarc&#243;n José Manuel Alarcón Spain dice:

Sí que funciona. No sé qué significa eso de que "la página esté con AJAX totalmente"...

Si te fijas bien en los requisitos de navegadores quizá te pueda ayudar, pero los ejemplos están probados con todos ellos. Prueba bien...

6.
Gaston Carrizo Gaston Carrizo Argentina dice:

Quería agradecerte el consejo, la verdad que desconocía este evento que en verdad me solucionó un problema importante. Agendo esta página por futuras dudas. Si puedo aportar en algo tenés mi email. Saludos. Gaston.

7.
Jos&#233; Francisco Ibarra José Francisco Ibarra Spain dice:

Es posible actuar si el usuario ha elegido una u otra cosa? Esto es, si por ejemplo el usuario responde que si quiere salir, podría avisar al servidor por medio por ejemplo de ajax de que ese usuario va a salir?

Seria algo como esto, pero no funciona, con esto se suplanta, o ponemos una pregunta antes de darle la información al navegador
window.onbeforeunload = function (evt) {
            if (confirm('Are you sure to exit')) {
                'aqui hacer una llamada a server informando
                return true;

            }
            else
                return false;
        }

8.
Jos&#233; M. Alarc&#243;n José M. Alarcón Spain dice:

Hola,

En este evento sólo se puede devolver un mensaje y no hay forma de saber qué ha elegido el usuario.

Saludos

9.
Panfilo Panfilo Mexico dice:

GrAcIaS pOr Tu ApOrTe...
De GrAn AyUdA!!!

10.
ReN Fractal ReN Fractal Mexico dice:

Muchas Gracias aqui en el trabajo desde hace mucho me estaban pidiendo que al cerrar con la X me actualizara la base de datos a sesión cerrada :D


Les dejo un ejemplo con Ajax

        <script language="JavaScript" type="text/javascript">
            window.onbeforeunload = function(){
                $.ajax({
                    type: "POST",
                    url: "salida.jsp",
                    dataType:"json",
                    data: {},
                    async : false,
                    success : function(){
                    }
                });
            }
        </script>

Agregar comentario

  Country flag

biuquote
  • Comentario
  • Vista previa
Loading