2010-02-10 4 views
1

J'ai la fonction Jquery suivante pour avertir l'utilisateur avec une invite quand il a des modifications non enregistrées (similaire à comment SO le fait) et essaie de quitter l'écran en cours.Pourquoi OnBeforeUnload tire-t-il deux fois avec asp: LinkButton?

<!-- in my aspx page --> 
<script type="text/javascript" language="javascript"> 
    window.onbeforeunload = function() 
    { 
     if (HasPendingUpdates()) 
     { 
      return "Changes you have made will not be saved."; 
     } 
    } 
</script> 

Cela fonctionne comme prévu et montre la boîte de message lorsque l'utilisateur tente de cliquer sur un href pour naviguer loin ou utilisez le bouton de retour, etc. Le problème que j'ai est que l'un de mes liens est un asp:LinkButton parce qu'il doit déclencher un code côté serveur avant de quitter la page. Lorsque l'utilisateur clique sur ce LinkButton, ils reçoivent l'invite deux fois.

Scénarios:

  1. 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. utilisateur clique sur le LinkButton

  5. apparaît et clique invite le bouton OK.
  6. L'invite disparaît et le même message 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 est-ce que je reçois la deuxième invite ??? Comment le OnBeforeUnload tire-t-il deux fois?

Répondre

0

L'ajout de gestionnaires avec jQuery les empile. Si vous affectez un handler avec une fonction jQuery à vos hrefs et que vous l'affectez à nouveau pour votre linkbutton, deux handlers seront en place.

Vérifiez la fréquence à laquelle vous liez le gestionnaire onunload et assurez-vous que vous êtes en train de désengager les gestionnaires précédents ou seulement une fois.

+0

Je ne suis pas déléguant l'ha ndlers spécifiquement à tous les contrôles. La fonction Jquery s'exécute lors du chargement de la page et affecte la fonction à la fenêtre.onbeforeunload. La page n'est jamais chargée plus d'une fois donc le code Jquery ne doit lier qu'une seule fois. Tous les autres liens, bouton de retour, etc ne provoquent pas une double invite. – Kelsey

0

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; 
    } 
2

J'ai eu un problème similaire, mais je ne voulais pas tirer onbeforeunload pour linkbuttons du tout, donc je les suivantes pour chaque LinkButton sur la. page ASPX:

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

fonctionnalité des linkbuttons n'a pas été paralysés, car tout ce qu'ils ont fournissait une commande avec CommandArgument pour la codebehind gérer ...

Questions connexes