315 votes

Comment afficher le message "Are you sure you want to navigate away from this page ?" lorsque les modifications sont validées ?

Ici dans stackoverflow, si vous avez commencé à faire des changements et que vous essayez de naviguer hors de la page, un bouton de confirmation javascript s'affiche et demande : "Etes-vous sûr de vouloir quitter cette page ?" blee blah bloo...

Quelqu'un a-t-il déjà mis en œuvre ce système ? Comment puis-je savoir si les changements ont été validés ? Je pense pouvoir le faire moi-même, mais j'essaie d'apprendre les bonnes pratiques auprès de vous, les experts.

J'ai essayé ce qui suit mais cela ne fonctionne toujours pas :

<html>
<body>
    <p>Close the page to trigger the onunload event.</p>
    <script type="text/javascript">
        var changes = false;        
        window.onbeforeunload = function() {
            if (changes)
            {
                var message = "Are you sure you want to navigate away from this page?\n\nYou have started writing or editing a post.\n\nPress OK to continue or Cancel to stay on the current page.";
                if (confirm(message)) return true;
                else return false;
            }
        }
    </script>

    <input type='text' onchange='changes=true;'> </input>
</body>
</html>

Quelqu'un peut-il afficher un exemple ?

3 votes

Pour que votre exemple fonctionne, changez la fonction en : myFunction() { window.onbeforeunload = "message" ; } puis changez l'entrée : <input type='text' onchange='myFunction();'></input>

0 votes

454voto

Keith Points 46288

Mise à jour (2017)

Les navigateurs modernes considèrent désormais l'affichage d'un message personnalisé comme un risque pour la sécurité. supprimé de tous. Les navigateurs n'affichent plus que des messages génériques. Puisque nous n'avons plus à nous préoccuper de la définition du message, il est aussi simple que :

// Enable navigation prompt
window.onbeforeunload = function() {
    return true;
};
// Remove navigation prompt
window.onbeforeunload = null;

Lisez ci-dessous pour le support des anciens navigateurs.

Mise à jour (2013)

La réponse originale est adaptée à IE6-8 et FX1-3.5 (ce que nous visions en 2009 lorsqu'elle a été rédigée), mais elle est plutôt dépassée maintenant et ne fonctionnera pas dans la plupart des navigateurs actuels - je l'ai laissée ci-dessous pour référence.

El window.onbeforeunload n'est pas traité de manière cohérente par tous les navigateurs. Il devrait s'agir d'une référence de fonction et non d'une chaîne de caractères (comme l'indiquait la réponse originale), mais cela fonctionnera dans les navigateurs plus anciens, car la vérification de la plupart d'entre eux semble consister à savoir si quelque chose est affecté à onbeforeunload (y compris une fonction qui renvoie null ).

Vous mettez window.onbeforeunload à une référence de fonction, mais dans les navigateurs plus anciens, vous devez définir l'attribut returnValue de l'événement au lieu de renvoyer simplement une chaîne de caractères :

var confirmOnPageExit = function (e) 
{
    // If we haven't been passed the event get the window.event
    e = e || window.event;

    var message = 'Any text will block the navigation and display a prompt';

    // For IE6-8 and Firefox prior to version 4
    if (e) 
    {
        e.returnValue = message;
    }

    // For Chrome, Safari, IE8+ and Opera 12+
    return message;
};

Tu ne peux pas avoir ça confirmOnPageExit effectue la vérification et renvoie null si vous voulez que l'utilisateur continue sans le message. Vous devez toujours supprimer l'événement pour l'activer et le désactiver de manière fiable :

// Turn it on - assign the function that returns the string
window.onbeforeunload = confirmOnPageExit;

// Turn it off - remove the function entirely
window.onbeforeunload = null;

Réponse originale (travaillée en 2009)

Pour l'allumer :

window.onbeforeunload = "Are you sure you want to leave?";

Pour l'éteindre :

window.onbeforeunload = null;

Gardez à l'esprit qu'il ne s'agit pas d'un événement normal - vous ne pouvez pas vous lier à lui de la manière habituelle.

Pour vérifier les valeurs ? Cela dépend de votre cadre de validation.

En jQuery, cela pourrait être quelque chose comme (exemple très basique) :

$('input').change(function() {
    if( $(this).val() != "" )
        window.onbeforeunload = "Are you sure you want to leave?";
});

0 votes

J'ai beaucoup de TBs dans mon formulaire web, je veux définir un drapeau booléen global dans la page, puis avec jquery parcourir toutes les entrées avec type=text et définir le onchange pour changer le drapeau. l'utilisation de votre fonction évaluant le drapeau ?

4 votes

Ce serait quelque chose comme : $('input:text').change(function() { window.onbeforeunload = $('input:text[value!=""]').length > 0 ? "avertissement" :null ; }) ;

1 votes

Pour une vérification simple, ou vous pouvez ajouter une validation plus complexe sur chaque changement

41voto

Søren Løvborg Points 3425

L' onbeforeunload Microsoft-ism est la chose la plus proche que nous avons à une solution standard, mais être conscient que la prise en charge du navigateur est inégale; par exemple, pour l'Opéra, il ne fonctionne que dans la version 12, et plus tard (encore en version bêta de cette écriture).

Aussi, pour un maximum de compatibilité, vous devez faire plus que de simplement retourner une chaîne de caractères, comme expliqué sur le Mozilla Developer Network.

Exemple: Définir les deux fonctions suivantes pour activer/désactiver l'invite de navigation (cf. le MDN exemple):

function enableBeforeUnload() {
    window.onbeforeunload = function (e) {
        return "Discard changes?";
    };
}
function disableBeforeUnload() {
    window.onbeforeunload = null;
}

Définissez ensuite un formulaire comme ceci:

<form method="POST" action="" onsubmit="disableBeforeUnload();">
    <textarea name="text"
              onchange="enableBeforeUnload();"
              onkeyup="enableBeforeUnload();">
    </textarea>
    <button type="submit">Save</button>
</form>

De cette façon, l'utilisateur doit uniquement être mis en garde à propos de l'utilisation de suite si il a changé la zone de texte, et de ne pas être invité quand il est en fait la soumission du formulaire.

1 votes

D'après le site de Mozill, la plupart des navigateurs de bureau récents le prennent désormais en charge : developer.mozilla.org/fr/DOM/window.onbeforeunload

0 votes

Le "Microsoft-isme" est un excellent terme.

20voto

stigok Points 4223

Pour que cela fonctionne dans Chrome et Safari, vous devez procéder comme suit

window.onbeforeunload = function(e) {
    return "Sure you want to leave?";
};

Référence : https://developer.mozilla.org/en/DOM/window.onbeforeunload

18voto

Sam Saffron Points 56236

Avec JQuery ce truc est assez facile à faire. Puisque vous pouvez vous lier à des ensembles.

Il n'est PAS suffisant de faire le onbeforeunload, vous voulez seulement déclencher le navigate away si quelqu'un commence à éditer des choses.

2 votes

Je n'arrive pas à lire les articles du blog de @jonstjohn. Peut-être sera-t-il un ami et nous indiquera-t-il la bonne direction ? :D

16 votes

\=> 500 Internal error. C'est pourquoi les liens sont dépréciés sur SO. Downvoted jusqu'à ce qu'ils soient corrigés.

0 votes

Cette page web n'est pas disponible

14voto

Devon Peticolas Points 61

Jquerys 'beforeunload' a bien fonctionné pour moi

$(window).bind('beforeunload', function(){
    if( $('input').val() !== '' ){
        return "It looks like you have input you haven't submitted."
    }
});

0 votes

Bind a été déprécié et une version plus récente du code similaire à celui-ci peut être vue dans cette réponse : stackoverflow.com/a/1889450/908677

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X