fenêtre.onbeforeunload ne fonctionne pas en chrome

c'est le code que j'ai utilisé pour window.onbeforeunload......

<head>
<script>

    window.onbeforeunload = func;

    function func() 
    {
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = stateChanged;
        request.send(null);
    }
    function stateChanged()
    {
        if (request.readyState == 4 || request.readyState == "complete")
            alert("Succes!");
    }
    </script>
    </head>

cela fonctionne avec IE et mozila mais ne fonctionne pas avec chrome..... s'il vous plaît aider...... merci à l'avance.....

3
demandé sur siddhesh 2011-01-26 09:50:39

7 réponses

il semble que la seule chose que vous pouvez faire avec onbeforeunload dans la version récente de Chrome est de configurer le message d'avertissement.

window.onbeforeunload = function () {
    return "Are you sure";
};

fonctionnera. Autre code dans la fonction semble être ignoré par Chrome


mise à jour : à partir de Chrome V51, la chaîne retournée sera ignorée et un message par défaut affiché à la place.

15
répondu LapinLove404 2018-03-13 10:37:09

Je sais que je suis en retard pour ça, mais je me grattais la tête Pourquoi mon message avant chargement personnalisé ne fonctionnait pas dans Chrome et lisait ça. Ainsi, si quelqu'un d'autre fait la même chose, Chrome à partir de la Version 51 ne supporte plus les messages personnalisés sur beforeunload. Apparemment, c'est parce que la fonctionnalité a été mal utilisée par diverses escroqueries. Au lieu de cela, vous recevez un message Chrome prédéfini qui peut ou ne peut pas convenir à vos fins. Plus de détails à:

https://developers.google.com/web/updates/2016/04/chrome-51-deprecations?hl=en#remove-custom-messages-in-onbeforeload-dialogs

personnellement ne pensent pas que le message qu'ils ont choisi est un grand car il mentionne quitter le site et l'un des usages légitimes les plus courants pour onbeforeunload est pour le traitement/vérification de drapeau sale sur un formulaire web donc ce n'est pas une grande formulation que la plupart du temps l'Utilisateur sera encore sur votre site, juste ont cliqué sur l'annuler ou bouton de recharge par erreur.

9
répondu Clarkio 2016-06-30 17:28:03

a confirmé ce comportement sur chrome 21.0.1180.79

cela semble fonctionner avec les mêmes restrictions que XSS, si vous rafraîchissez la page ou ouvrez une page sur le même domaine+port le script est exécuté, sinon il ne sera exécuté que si vous retournez une chaîne de caractères (ou similaire) et une boîte de dialogue sera affichée demandant à l'utilisateur s'il veut se pencher ou rester dans la page.

c'est une chose stupide incroyable à faire, parce que onunload/onbeforeunload ne sont pas seulement utilisés pour demander/empêcher des changements de page.

dans mon cas, je l'utilisais aussi enregistrer quelques modifications effectuées lors de l'édition de page et je ne veux pas empêcher l'utilisateur de changer la page (au moins chrome devrait respecter un retour true ou modifier la page sans demander si le retour n'est pas une chaîne), script des restrictions de temps d'exécution seraient enought.

ceci est particulièrement gênant dans chrome parce que l'événement onblur n'est pas envoyé aux éléments d'édition quand décharger une page, chrome isore simplement la page actuelle et saute à une autre. Donc le seul changement de sauvegarder les modifications était le processus de déchargement et il ne peut pas être fait maintenant sans la question stupide si l'utilisateur veut le changer... bien sûr qu'il veut et je ne voulais pas l'empêcher...

hope chrome résout cela d'une manière plus élégante bientôt.

4
répondu neu-rah 2012-08-18 14:38:07

essayez ceci, ça a marché pour moi:

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};
3
répondu harisrozak 2015-09-30 02:25:43

essayez ceci. Je l'ai essayé et il fonctionne. Intéressant mais le message de succès n'a pas besoin de confirmation comme l'autre message.

window.onbeforeunload = function() 
{
    if ( window.XMLHttpRequest )
    {
        console.log("before"); //alert("before");
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = function () {
            if ( request.readyState == 4 && request.status == 200 )
            {
                console.log("Succes!"); //alert("Succes!");
            }
        };
        request.send();
    }
}
1
répondu Bakudan 2012-06-26 10:55:42

les versions actuelles de Chrome nécessitent de définir la propriété returnValue de L'événement. Le simple fait de renvoyer une chaîne du gestionnaire d'événements ne déclenchera pas l'alerte.

addEventListener('beforeunload', function(event) {
  event.returnValue = 'You have unsaved changes.';
});
0
répondu Jeremy Danyow 2016-03-06 23:20:48

J'exécute Chrome sur MacOS High Sierra et j'ai un projet angulaire de 6 dans lequel je gère la fenêtre.beforeunload une fenêtre.onbeforeunload événements. Vous pouvez le faire, ça a marché pour moi:

handleUnload(event) {
  // Chrome
  event.returnValue = true;
}

il me montre une erreur quand j'essaie de mettre une chaîne dans l'événement.returnValue, il veut un booléen.

0
répondu Dorian Maliszewski 2018-07-18 14:36:35