2011-12-20 10 views
5

Estoy desarrollando una de esas ventanas de advertencia que le dice al usuario que pueden tener datos no guardados, pero solo necesito advertirles si abandonan la página. Actualmente lo hace en actualizaciones, devoluciones, etc. Me preguntaba si había alguna forma de saber cómo se descargó la página u obtener más detalles sobre lo que el usuario está haciendo para descargar la página. (soluciones jquery bienvenidas).window.onbeforeunload: ¿Es posible obtener detalles sobre cómo se descargó la ventana?

Código

para referencia:

 
    window.onbeforeunload = function() { 
     if (formIsDirty) {    
      formIsDirty = false; 
      return "Are you sure you want to navigate away from this page?"; 
     } 
    } 

Respuesta

6

en beforeunload evento que podemos hacer las cosas a continuación:

  1. Podemos pasar evento como parámetro a la función que en respuesta anterior. Ahora podemos utilizar este evento para la información disponible adjunta a este evento .
  2. Y podemos acceder a las variables de nivel de documento.

Por ejemplo, document.activeElement le dará el último elemento que hizo clic que causó la descarga de la página.

Espero que esto ayude !!

+0

Utilicé 'document.activeElement' con éxito en IE, FF y Chrome. –

+0

fantástico @RoelvanDuijnhoven !! –

+0

¡Creo que esta debería ser la respuesta aceptada! – EthR

2

Respuesta corta: No hay manera fácil de averiguar qué está causando onbeforeunload al fuego.

Respuesta larga: Dentro de la ventana. Antes de descargar el controlador puede acceder al objeto window.event, que puede tener algunas propiedades útiles para determinar cómo se está cerrando la ventana.

Por ejemplo, si window.event.srcElement es una etiqueta de anclaje, entonces usted sabe que el evento onbeforeunload se activa mediante una etiqueta de ancla que se hace clic. Para obtener más propiedades, consulte las páginas event y onbeforeunload en MSDN.

Editar: algo más de información que he tropezado -

Si desea ignorar los controles ASP que causan posterior a la espalda, se puede interrogar a la entrada oculta '__EVENTTARGET'. Si esta entrada tiene un valor de cadena no vacío, un control ASP vuelve a publicar la página.

También podría verificar la propiedad keyCode (si se presionó F5, provocando una actualización) o la posición del mouse para ver si se hizo clic en el botón X (cerrar).

+0

No, el objetivo de window.onbeforeunload es siempre window. – kennebec

+0

mencioné interrogar a la propiedad srcElement, no al destino del evento :) – jbabey

+0

¿Window.event.srcElement es exclusivo de Internet Explorer? No obtengo ningún resultado en Firefox cuando intento: window.onbeforeunload = function() {alert (window.event.srcElement)} – Maxx

2

Me encontré con un problema similar cuando un usuario estaba presionando enter desde un campo de entrada en un formulario. El formulario se envió y desencadenó el evento onbeforeunload. Intenté configurar una bandera para evitar mostrar el mensaje en el evento de selección de teclas en la entrada, filtrando el código enterkey. Esto no se activó hasta después de que se desencadenara el evento onbeforeunload y, por lo tanto, no se estaba estableciendo el indicador.

Luego miré en _EVENTTARGET como sugirió Jbabey. Si se enviara el formulario, habría un valor en ese campo; si se actualizara, no lo sería.

Por lo tanto, haciendo una simple comprobación para ver si había valor en el campo _EVENTARGET en el evento onbeforeunload podría determinar si la entrada del formulario estaba causando la devolución de datos.

Aquí está mi código.

  window.onbeforeunload = function (e) { 
      if ($('[id$=__EVENTTARGET]').val().indexOf('btnValidateMaterials') != -1) { 
       confirmExit = false; 
      } 

      if (DateOrQtyHasChanged() && confirmExit) { 

       if (/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
        var message = $('[id$=hfLeaveMessageFF]').val(); 
        if (confirm(message)) { 
         history.go(); 
        } 
        else { 
         window.setTimeout(function() { 
          window.stop(); 
         }, 1); 
        } 
       } 
       else { 
        var message = $('[id$=hfLeaveMessage]').val(); 
        return message; 
       } 
      } 
     } 
0

Creo que el elemento activo no es una solución válida.

No puedo comentar la solución "abierta y gratuita", no tengo reputación.

document.getActiveElement obtiene el elemento enfocado actualmente en el documento. Si un enlace tiene el foco y presiono F5 o cierro la pestaña, el elemento activo es el enlace.

Cuestiones relacionadas