Domanda

Ho una pagina che fa un bel po ' di lavoro e non voglio che l'utente sia in grado di navigare lontano dalla pagina (chiuso il browser, colpito il pulsante indietro, etc.) senza un avviso.Ho trovato che l'evento onbeforeunload (che penso sia IE specifiche, che funziona bene per me, come il progetto utilizza un sacco di ActiveX) funziona alla grande.

Il problema è che io voglio che l'utente sia in grado di fare clic su un po ' di "aiuto" icona nell'angolo superiore destro e pop-up una finestra di aiuto in qualsiasi momento.Questo provoca onbeforeunload a fuoco, anche se la finestra principale non va da nessuna parte e la pagina non scarica.

La funzione JavaScript che viene eseguito quando l'evento onbeforeunload corre appena mette il testo in evento.returnValue.Se ho potuto constatare, in qualche modo, che l'icona della guida è quello che è stato cliccato, quindi potrei non mettere il testo in evento.returnValue in quella situazione.Ma come ho potuto pagina a capirlo?

È stato utile?

Soluzione

Mi lasci indovinare:l'aiuto di "icona" è in realtà un collegamento con un javascript: url?Modifica di un vero e proprio pulsante, un collegamento reale, o almeno mettere le funzionalità di un gestore di evento onclick (che impedisce il comportamento predefinito).Problema risolto.

<!-- 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>

Altri suggerimenti

EDIT: La mia "soluzione" di seguito è eccesso, in base alla mia mancanza di comprensione.Andare con Shog9 la risposta di sopra.

OK, mentre scrivevo la domanda, mi si avvicinò con una soluzione che funziona per ora.

Ho messo una variabile JavaScript globale in atto come un booleano se l'icona è di essere dannato.Quindi, si allega di eventi per l'immagine del onmouseover e onmouseout eventi e scrivere funzioni che impostare questo valore.Infine, ho solo il codice nella funzione che gestisce onbeforeunload che controlla questo valore prima di impostare evento.returnValue.

Probabilmente non è una soluzione perfetta, ma lavorerà per ora.

su internet si trovano molte persone suggerendo di usare qualcosa come

finestra.onbeforeunload = null

ma questo non funziona per me in IE6.la lettura nella MSDN documenti per l'evento in oggetto ho trovato un riferimento all'evento.cancelBubble proprietà, che ho pensato che era la soluzione.ma grazie a Orso, il quale ha sottolineato che l'impostazione di "evento.cancelBubble=true" è inutile, il modo per sbarazzarsi di la conferma è da escludere l'istruzione return del tutto, ho scelto di usare una variabile booleana, come una bandiera per decidere se tornare a qualcosa o no.nell'esempio riportato di seguito aggiungo il codice javascript programattically nel codice sottostante:

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>");

quindi il pulsante guida contiene le seguenti aspx markup:

OnClientClick="postback=true;return true;

questo set di la 'di postback' variabile a true, che viene raccolto in confirmExit funzione di (), avendo l'effetto di annullare l'evento.

spero che troverete utile.è stato testato e funziona in IE6 e FF 1.5.0.2.

Ho un metodo che è un po ' scomodo, ma funziona nella maggior parte dei casi.

Creare una "Holding" popup pagina contenente un FRAMESET con, 100% FOTOGRAMMA singolo e posto normale onUnload e onbeforeUnload gestori di eventi in TESTA.

<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>

Utilizzando questo metodo si è liberi di utilizzare l'attuale pagina che si desidera visualizzare, inviare e fare clic su collegamenti ipertestuali senza la cornice esterna onUnload o evento onbeforeUnload di essere licenziato.

Se la cornice esterna è aggiornato o se effettivamente chiuso gli eventi sarà il fuoco.

Come ho detto, non full-prova, ma otterrà giro la generazione dell'evento in ogni clic o di postback.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top