Pourquoi OnBeforeUnload déclenche-t-il deux fois avec asp: LinkButton?

J’ai la fonction JQuery suivante pour avertir l’utilisateur avec une invite lorsqu’il a des modifications non enregistrées (similaire à la façon dont le fait SO) et qu’il tente de quitter l’écran actuel.

  window.onbeforeunload = function() { if (HasPendingUpdates()) { return "Changes you have made will not be saved."; } }  

Cela fonctionne comme prévu et affiche la boîte de message lorsque l’utilisateur essaie de cliquer sur un href pour naviguer ou d’utiliser le bouton Précédent. Le problème que j’ai est qu’un de mes liens est un asp:LinkButton car il doit en déclencher une code côté serveur avant de quitter la page. Lorsque l’utilisateur clique sur ce LinkButton il reçoit l’invite deux fois.

Scénarios:

  1. L’utilisateur clique sur le LinkButton
  2. Invite apparaît et l’utilisateur clique sur le bouton d’annulation.
  3. L’invite disparaît et l’utilisateur est toujours à l’écran. BIEN.

  4. L’utilisateur clique sur le LinkButton

  5. Invite apparaît et clique sur le bouton OK.
  6. L’invite disparaît et la même invite s’affiche à nouveau.
  7. L’utilisateur clique à nouveau sur OK.
  8. L’invite disparaît et l’utilisateur passe à l’écran suivant et tout va bien.

Alors, pourquoi je reçois la deuxième invite ??? Comment l’OnBeforeUnload se déclenche-t-il deux fois?

J’ai eu un problème similaire, cependant, je ne voulais absolument pas lancer onbeforeunload pour LinkButtons, c’est pourquoi j’ai utilisé ce qui suit pour chaque LinkButton sur la page .aspx:

 OnClientClick="eval(this.href);return false" 

La fonctionnalité des LinkButtons n’était pas handicapée, car ils ne fournissaient qu’une commande avec CommandArgument à manipuler par le code-behind …

L’ajout de gestionnaires avec jQuery les emstack. Si vous assignez un gestionnaire avec une fonction jQuery pour vos hrefs, puis que vous le réassignez pour votre linklink, il y aura deux gestionnaires en place.

Vérifiez la fréquence à laquelle vous liez le gestionnaire onunload et assurez-vous de dissocier les gestionnaires précédents ou de ne le faire qu’une fois.

Voici comment résoudre ce problème:

  var checkChangesEnabled = true; window.onbeforeunload = confirmExit; function confirmExit() { if (checkChangesEnabled) { event.returnValue = "Changes you have made will not be saved."; disableCheck(); } } function disableCheck() { checkChangesEnabled = false; setTimeout("enableCheck()", "100"); } function enableCheck() { checkChangesEnabled = true; }