Pregunta

Tengo una página que hace bastante trabajo y no quiero que el usuario pueda salir de esa página (cerrar el navegador, presionar el botón Atrás, etc.) sin recibir una advertencia.Descubrí que el evento onbeforeunload (que creo que es específico de IE, que funciona bien para mí ya que el proyecto usa mucho ActiveX) funciona muy bien.

El problema es que quiero que el usuario pueda hacer clic en un pequeño icono de "ayuda" en la esquina superior derecha y que aparezca una ventana de ayuda en cualquier momento.Esto hace que se active onbeforeunload, aunque la ventana principal nunca va a ninguna parte y la página nunca se descarga.

La función de JavaScript que se ejecuta cuando se ejecuta el evento onbeforeunload simplemente coloca texto en event.returnValue.Si pudiera asegurarme, de alguna manera, de que se hizo clic en el ícono de ayuda, entonces simplemente no podría poner texto en event.returnValue en esa situación.¿Pero cómo podría hacer que la página se diera cuenta de eso?

¿Fue útil?

Solución

Déjame adivinar:el "icono" de ayuda es en realidad un enlace con un javascript: URL?Cámbielo a un botón real, un enlace real o al menos coloque la funcionalidad en un controlador de eventos onclick (que evita el comportamiento predeterminado).Problema resuelto.

<!-- clicking this link will do nothing. No onbeforeunload handler triggered. 
Nothing. 
And you could put something in before the return false bit...
...and the onunload handler would still not get called... -->
<a href="http://www.google.com/" onclick="return false;">blah1</a>
<!-- this should also do nothing, but IE will trigger the onbeforeunload 
handler -->
<a href="javascript:void(0)">blah2</a>

Otros consejos

EDITAR: Mi "solución alternativa" a continuación es completamente exagerada, basada en mi falta de comprensión.Vaya con la respuesta anterior de Shog9.

Bien, mientras escribía la pregunta, se me ocurrió una solución que funcionará por ahora.

Puse una variable global de JavaScript en acción como booleana sobre si se está pasando el cursor sobre el ícono o no.Luego, adjunto eventos a los eventos onmouseover y onmouseout de la imagen y escribo funciones que establecerán este valor.Finalmente, simplemente codifico la función que maneja onbeforeunload que verificará este valor antes de configurar event.returnValue.

Probablemente no sea una solución perfecta, pero funcionará por ahora.

En Internet encontrarás muchas personas que te sugieren usar algo como

ventana.onbeforeunload = nulo

pero esto no me funciona en IE6.Al leer los documentos de MSDN para el objeto de evento, encontré una referencia a la propiedad event.cancelBubble, que pensé que era la solución.pero gracias a Orso, quien señaló que configurar "event.cancelBubble=true" es inútil, la forma de deshacerse del mensaje de confirmación es excluir la declaración de devolución por completo, elegí usar una variable booleana como indicador para decidir si devolver algo o no.en el siguiente ejemplo, agrego el código javascript mediante programación en el código subyacente:

Page.ClientScript.RegisterStartupScript(typeof(String), "ConfirmClose", @"  <script>        window.onbeforeunload = confirmExit;        function confirmExit()      {           if(postback == false)               return ""Please don't leave this page without clicking the 'Save Changes' or 'Discard Changes' buttons."";                                                      }       </script>");

entonces el botón de ayuda contiene el siguiente marcado aspx:

OnClientClick="postback=true;return true;

esto establece la variable 'devolución de datos' en verdadero, que se selecciona en la función confirmExit(), lo que tiene el efecto de cancelar el evento.

Espero que encuentres esto útil.está probado y funciona en IE6 y FF 1.5.0.2.

Tengo un método que es un poco complicado pero funcionará en la mayoría de los casos.

Cree una página emergente "Holding" que contenga un FRAMESET con un FRAME 100% único y coloque los controladores de eventos onUnload y onbeforeUnload normales en HEAD.

<html>
<head>
<script language="Javascript" type="text/javascript">
  window.onbeforeunload = exitCheck;
  window.onunload = onCloseDoSomething;

  function onCloseDoSomething()
  {
  alert("This is executed at unload");
  }

  function exitCheck(evt)
  {
  return "Any string here."}
  </script>
  </head>

    <frameset rows="100%">
    <FRAME name="main" src="http://www.yourDomain.com/yourActualPage.aspx">
    </frameset>
<body>
</body>
</html>

Con este método, puede usar la página real que desea ver, publicar y hacer clic en los hipervínculos sin que se active el marco exterior del evento onUnload o onbeforeUnload.

Si el marco exterior se actualiza o se cierra, los eventos se activarán.

Como dije, no es completamente seguro, pero evitará la activación del evento con cada clic o devolución de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top