Question

J'ai une page qui fait pas mal de travail et je ne veux pas que l'utilisateur puisse quitter cette page (fermer le navigateur, bouton de réponse, etc.) sans recevoir d'avertissement.J'ai trouvé que l'événement onbeforeunload (qui, je pense, est spécifique à IE, ce qui fonctionne bien pour moi car le projet utilise beaucoup d'ActiveX) fonctionne très bien.

Le problème est que je souhaite que l'utilisateur puisse cliquer sur une petite icône « aide » dans le coin supérieur droit et afficher une fenêtre d'aide à tout moment.Cela provoque le déclenchement de onbeforeunload, même si la fenêtre principale ne va nulle part et que la page ne se décharge jamais.

La fonction JavaScript qui s'exécute lorsque l'événement onbeforeunload s'exécute place simplement le texte dans event.returnValue.Si je pouvais m'assurer, d'une manière ou d'une autre, que l'icône d'aide est celle sur laquelle on a cliqué, je ne pourrais tout simplement pas mettre de texte dans event.returnValue dans cette situation.Mais comment pourrais-je faire en sorte que la page comprenne cela ?

Était-ce utile?

La solution

Laisse-moi deviner:l'"icône" d'aide est en fait un lien avec un javascript: URL ?Changez-le en un vrai bouton, un vrai lien, ou au moins placez la fonctionnalité dans un gestionnaire d'événements onclick (ce qui empêche le comportement par défaut).Problème résolu.

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

Autres conseils

MODIFIER: Ma "solution de contournement" ci-dessous est complètement exagérée, basée sur mon manque de compréhension.Suivez la réponse de Shog9 ci-dessus.

OK, alors pendant que j'écrivais la question, j'ai trouvé une solution de contournement qui fonctionnera pour le moment.

J'ai mis une variable JavaScript globale en tant que booléen indiquant si l'icône est survolée ou non.Ensuite, j'attache des événements aux événements onmouseover et onmouseout de l'image et j'écris des fonctions qui définiront cette valeur.Enfin, je viens de coder dans la fonction qui gère onbeforeunload qui vérifiera cette valeur avant de définir event.returnValue.

Ce n’est probablement pas une solution parfaite, mais cela fonctionnera pour le moment.

sur Internet, vous trouverez de nombreuses personnes vous suggérant d'utiliser quelque chose comme

window.onbeforeunload = null

mais cela ne fonctionne pas pour moi dans IE6.en lisant dans la documentation MSDN pour l'objet événement, j'ai trouvé une référence à la propriété event.cancelBubble, que je pensais être la solution.mais grâce à Orso qui a souligné que le réglage de "event.cancelBubble=true" est inutile, le moyen de se débarrasser de l'invite de confirmation est d'exclure complètement l'instruction return, j'ai choisi d'utiliser une variable booléenne comme indicateur pour décider si rendre quelque chose ou non.dans l'exemple ci-dessous, j'ajoute le code javascript par programme dans le code derrière :

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

alors le bouton d'aide contient le balisage aspx suivant :

OnClientClick="postback=true;return true;

cela définit la variable 'postback' sur true, qui est récupérée dans la fonction confirmExit(), ayant pour effet d'annuler l'événement.

Espérant que ceci puisse t'être utile.il est testé et fonctionne dans IE6 et FF 1.5.0.2.

J'ai une méthode un peu lourde mais qui fonctionnera dans la plupart des cas.

Créez une page contextuelle "Holding" contenant un FRAMESET avec un FRAME 100% unique et placez les gestionnaires d'événements onUnload et onbeforeUnload normaux dans le 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>

En utilisant cette méthode, vous êtes libre d'utiliser la page réelle que vous souhaitez voir, de publier en arrière et de cliquer sur les hyperliens sans que l'événement onUnload ou onbeforeUnload du cadre externe ne soit déclenché.

Si le cadre extérieur est actualisé ou réellement fermé, les événements se déclencheront.

Comme je l'ai dit, ce n'est pas totalement à l'épreuve, mais cela contournera le déclenchement de l'événement à chaque clic ou publication.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top