Question

Je crée une fenêtre contextuelle dans laquelle un gestionnaire avant chargement est installé. Lorsque le " Fermer " L'élément de menu Fichier est utilisé pour fermer la fenêtre contextuelle, le gestionnaire beforeunload est appelé deux fois, ce qui donne deux "Voulez-vous vraiment fermer cette fenêtre?" messages apparaissant.

Il s'agit d'un bogue avec Firefox. l'a signalé ici . , mais je voudrais quand même un moyen d’empêcher que cela ne se produise. Pouvez-vous penser à un moyen sain de détecter le double avant le déchargement pour éviter le problème du double message? Le problème est que Firefox ne me dit pas quel bouton dans la boîte de dialogue l'utilisateur a choisi de cliquer sur - OK ou annuler.

Était-ce utile?

La solution 3

C’est définitivement un bug de FF. Je l'ai signalé à l'adresse https://bugzilla.mozilla.org/show_bug.cgi? id = 531199

Autres conseils

<script type="text/javascript">
var onBeforeUnloadFired = false;

window.onbeforeunload = function ()
{
    if (!onBeforeUnloadFired) {
        onBeforeUnloadFired = true;
        event.returnValue = "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
   }

   window.setTimeout("ResetOnBeforeUnloadFired()", 10);
}

function ResetOnBeforeUnloadFired() {
   onBeforeUnloadFired = false;
}    
</script>

Définissez une variable dans le gestionnaire pour empêcher la boîte de dialogue d’intervenir une deuxième fois. Utilisez setTimeout pour le réinitialiser par la suite.

La meilleure solution que j'ai trouvée consiste à utiliser une variable globale d'indicateur qui est réinitialisée après tant de millisecondes, disons 500 (cela garantit que la fonction peut être appelée à nouveau, mais pas immédiatement après son apparition).

Voir le dernier code dans:

http: // social .msdn.microsoft.com / Forums / fr / sharepointinfopath / thread / 13000cd8-5c50-4260-a0d2-bc404764966d

J'ai trouvé ce problème dans Chrome 21, Firefox 14, IE 7-9, Safari 5 (sur PC).

Ce qui suit fonctionne sur tous ces navigateurs. Si l’on supprime la fonction window.onbeforeunload lors de l’événement, le deuxième appel sera empêché. L'astuce consiste à réinitialiser la fonction window.onbeforeunload si l'utilisateur décide de rester sur la page.

var window_on_before_unload = function(e) {
    var msg;
    // Do here what you ever you need to do
    msg = "Message for user";

    // Prevent next "window.onbeforeunload" from re-running this code.
    // Ensure that if the user decides to stay on the page that
    // this code is run the next time the user tries to leave the page.
    window.onbeforeunload = set_on_before_unload;

    // Prepare message for user
    if (msg) {
        if (/irefox\/([4-9]|1\d+)/.test(navigator.userAgent))
            alert(msg
                    + '\n\nThe next dialog will allow you to stay here or continue\nSee Firefox bug #588292');

        (e = e || window.event).returnValue = msg;
        return msg;
    }
};

// Set window.onbeforeunload to the above handler.
// @uses window_on_before_unload
// @param {Event} e
var set_on_before_unload = function(e) {
    // Initialize the handler for window.onbeforeunload.
    window.onbeforeunload = window_on_before_unload;
}

// Initialize the handler for window.onbeforeunload.
set_on_before_unload();

Créez une variable globale définie sur true dans le gestionnaire. Affiche uniquement l'alerte / popup lorsque cette variable est fausse.

J'utilise l'extrait de code suivant pour suivre le nombre de sorties

Lorsque la page se charge, la variable suivante exitCount est initialisée

if (typeof(MTG) == 'undefined') MTG = {};
MTG.exitCount=0; 

et dans l'événement de déchargement de la fenêtre

$(window).bind("beforeunload", function(){


            if (MTG.exitCount<=0) 
            {

                             //do your thing, save etc
            }   
            MTG.exitCount++;




});

J'ai constaté qu'au lieu de faire votre propre appel à confirm (), il suffit de faire even.preventDefault (); au sein de l'événement beforeunload. Firefox affiche sa propre boîte de dialogue de confirmation. Je ne sais pas si c'est la bonne chose à faire, mais c'est comme ça qu'ils le font.

J'ai un document qui ouvre une autre fenêtre contextuelle avec window.open. Dans la fenêtre d'origine, j'ai enregistré (avec jQuery) un écouteur pour "décharger". événement comme celui-ci:

var popup_window = window.open(...) 
$(popup_window).on('unload', function(event) ...

Je suis tombé sur cette page parce que l'événement se déclenchait effectivement deux fois. Ce que j’ai découvert, c’est que ce n’est pas un bug, il se déclenche deux fois car il se déclenche une fois pour "& about; about: blank". page remplacée par votre page et une autre pour le déchargement de votre page.

Il suffit de filtrer l'événement qui m'intéresse en interrogeant l'événement d'origine:

function (event) {
   var original_url = e.originalEvent.originalTarget.URL;
   if (original_url != 'about:blank')
   {
       ... do cool things ...
   }
}

Je ne sais pas si cela s'applique à la question initiale, car il s'agit d'un cas particulier d'une fenêtre ouvrant une autre, mais j'espère que cela aidera.

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