Comment montrer le "Êtes-vous sûr de vouloir quitter cette page?"quand les changements commis?

Ici, dans stackoverflow, si vous avez commencé à apporter des modifications, vous essayez de vous éloigner de la page, un bouton de confirmation javascript apparaît et demande: "Êtes-vous sûr de vouloir vous éloigner de cette page?"blee bla bloo...

Quelqu'un a-t-il déjà implémenté cela, Comment puis-je suivre que les changements ont été commis? Je crois que je pourrais le faire moi-même, j'essaie d'apprendre les bonnes pratiques de vous les experts.

J'ai essayé ce qui suit mais ne le fait toujours pas travail:

<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?nnYou have started writing or editing a post.nnPress 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 poster un exemple?

226
demandé sur sshow 2009-07-13 16:57:09

17 réponses

Mise à jour (2017)

Navigateurs Modernes considérons maintenant l'affichage d'un message personnalisé à un risque de sécurité et il a donc été supprimé de tous. Les navigateurs n'affichent désormais que des messages génériques. Puisque nous n'avons plus à nous soucier de définir le message, c'est aussi simple que:

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

Lire ci-dessous pour le support du navigateur hérité.

Mise à jour (2013)

La réponse originale convient à IE6-8 et FX1-3.5 (ce que nous ciblions en arrière 2009 quand il a été écrit), mais est plutôt obsolète maintenant et ne fonctionnera pas dans la plupart des navigateurs actuels-Je l'ai laissé ci-dessous pour référence.

Le 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 (comme l'a indiqué la réponse originale) , mais cela fonctionnera dans les navigateurs plus anciens car la vérification pour la plupart d'entre eux semble être de savoir si quelque chose est assigné à onbeforeunload (y compris une fonction qui renvoie null).

Vous définissez window.onbeforeunload sur une fonction référence, mais dans les navigateurs plus anciens, vous devez définir le returnValue de l'événement au lieu de simplement renvoyer une chaîne:

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

Vous ne pouvez pas que confirmOnPageExit fasse la vérification et retourne 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é en 2009)

Pour l'activer:

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

Pour l'éteindre:

window.onbeforeunload = null;

Gardez à l'esprit que ce n'est pas un événement normal - vous ne pouvez pas lier de façon standard.

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

Dans 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?";
});
310
répondu Keith 2017-03-28 22:47:18

Le onbeforeunload Microsoft-ISM est la chose la plus proche d'une solution standard, mais sachez que le support du navigateur est inégal; par exemple pour Opera, il ne fonctionne que dans la version 12 et ultérieure (toujours en version bêta à ce jour).

Aussi, pour compatibilité maximale , vous devez faire plus que simplement retourner une chaîne, comme expliqué sur le Mozilla Developer Network .

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

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

Ensuite, définissez 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 ne sera averti de la navigation que s'il a modifié la zone de texte et ne sera pas invité lorsqu'il soumettra le formulaire.

37
répondu Søren Løvborg 2012-07-11 20:04:55

Pour que cela fonctionne dans Chrome et Safari, vous devez le faire comme ceci

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

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

19
répondu sshow 2012-07-11 20:06:34

Avec JQuery ce genre de choses est assez facile à faire. Puisque vous pouvez lier à des ensembles.

Ce n'est pas suffisant pour faire le onbeforeunload, vous voulez seulement déclencher le naviguer si quelqu'un a commencé à éditer des choses.

17
répondu Sam Saffron 2015-07-15 18:31:26

Jquerys 'beforeunload' a très bien fonctionné pour moi

$(window).bind('beforeunload', function(){
    if( $('input').val() !== '' ){
        return "It looks like you have input you haven't submitted."
    }
});
13
répondu Devon Peticolas 2012-07-11 19:48:02

C'est un moyen facile de présenter le message si toutes les données sont saisies dans le formulaire, et de ne pas afficher le message si le formulaire est soumis:

$(function () {
    $("input, textarea, select").on("input change", function() {
        window.onbeforeunload = window.onbeforeunload || function (e) {
            return "You have unsaved changes.  Do you want to leave this page and lose your changes?";
        };
    });
    $("form").on("submit", function() {
        window.onbeforeunload = null;
    });
})
11
répondu Carl G 2013-03-03 18:44:52

Pour les nouvelles personnes qui recherchent une solution simple, essayez simplement Areyousure.js

11
répondu lawphotog 2013-12-17 15:51:20

Pour développer la réponse déjà étonnante de Keith :

Messages D'avertissement personnalisés

Pour autoriser les messages d'avertissement personnalisés, vous pouvez l'envelopper dans une fonction comme celle-ci:

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

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

        // For Chrome, Safari, IE8+ and Opera 12+
        return message;
    };
    window.onbeforeunload = confirmOnPageExit;
}

Ensuite, appelez simplement cette fonction avec votre message personnalisé:

preventNavigation("Baby, please don't go!!!");

Activer à nouveau la navigation

Pour réactiver la navigation, il vous suffit de définir window.onbeforeunload sur null. Le voici, enveloppé dans une petite fonction soignée qui peut être appelée n'importe où:

function enableNavigation() {
    window.onbeforeunload = null;
}

Utilisation de jQuery pour lier ceci aux éléments de forme

Si vous utilisez jQuery, cela peut facilement être lié à tous les éléments d'un formulaire comme ceci:

$("#yourForm :input").change(function() {
    preventNavigation("You have not saved the form. Any \
        changes will be lost if you leave this page.");
});

Ensuite pour permettre la soumission du formulaire:

$("#yourForm").on("submit", function(event) {
    enableNavigation();
});

Formes modifiées dynamiquement:

preventNavigation() et enableNavigation() peut être lié à d'autres fonctions au besoin, comme l'dynamiquement modification d'un formulaire, ou en cliquant sur un bouton qui envoie une requête AJAX. Je l'ai fait en ajoutant un élément d'entrée caché au formulaire:

<input id="dummy_input" type="hidden" />

Puis chaque fois que je vous voulez empêcher l'utilisateur de naviguer loin, je déclenche le changement sur cette entrée pour vous assurer que preventNavigation() est exécuté:

function somethingThatModifiesAFormDynamically() {

    // Do something that modifies a form

    // ...
    $("#dummy_input").trigger("change");
    // ...
}
7
répondu Mike 2017-05-23 10:31:37

Ici, essayez ceci, il fonctionne à 100%

<html>
<body>
<script>
var warning = true;
window.onbeforeunload = function() {  
  if (warning) {  
    return "You have made changes on this page that you have not yet confirmed. If you navigate away from this page you will lose your unsaved changes";  
    }  
}

$('form').submit(function() {
   window.onbeforeunload = null;
});
</script>
</body>
</html>
3
répondu Braydon 2013-10-01 18:21:44

Lorsque l'utilisateur commence à apporter des modifications au formulaire, un indicateur booléen sera défini. Si l'utilisateur essaie ensuite de s'éloigner de la page, vous vérifiez cet indicateur dans la fenêtre .onunload événement. Si l'indicateur est défini, vous affichez le message en le renvoyant sous forme de chaîne. Renvoyer le message sous forme de chaîne affichera une boîte de dialogue de confirmation contenant votre message.

Si vous utilisez ajax pour valider les modifications, vous pouvez définir l'indicateur sur false après que les modifications ont été validées (c'est-à-dire dans le ajax succès de l'événement).

2
répondu Kirtan 2009-07-13 13:03:00

Vous pouvez ajouter un événement onchange sur la zone de texte (ou tout autre champ) qui définit une variable dans JS. Lorsque l'utilisateur tente de fermer la page (fenêtre.onunload) vous vérifiez la valeur de cette variable et montrez l'alerte en conséquence.

1
répondu Makram Saleh 2009-07-13 13:03:06

Sur la base de toutes les réponses sur ce fil, j'ai écrit le code suivant et cela a fonctionné pour moi.

Si vous n'avez que des balises input / textarea qui nécessitent la vérification d'un événement onunload, vous pouvez attribuer des attributs de données HTML5 comme data-onunload="true"

Pour par exemple.

<input type="text" data-onunload="true" />
<textarea data-onunload="true"></textarea>

Et le Javascript (jQuery) peut ressembler à ceci:

$(document).ready(function(){
    window.onbeforeunload = function(e) {
        var returnFlag = false;
        $('textarea, input').each(function(){
            if($(this).attr('data-onunload') == 'true' && $(this).val() != '')
                returnFlag = true;
        });

        if(returnFlag)
            return "Sure you want to leave?";   
    };
});
1
répondu Sagar Gala 2013-02-27 02:19:07

Voici mon html

<!DOCTYPE HMTL>
<meta charset="UTF-8">
<html>
<head>
<title>Home</title>
<script type="text/javascript" src="script.js"></script>
</head>

 <body onload="myFunction()">
    <h1 id="belong">
        Welcome To My Home
    </h1>
    <p>
        <a id="replaceME" onclick="myFunction2(event)" href="https://www.ccis.edu">I am a student at Columbia College of Missouri.</a>
    </p>
</body>

Et c'est ainsi que j'ai fait quelque chose de similaire en javaScript

var myGlobalNameHolder ="";

function myFunction(){
var myString = prompt("Enter a name", "Name Goes Here");
    myGlobalNameHolder = myString;
    if (myString != null) {
        document.getElementById("replaceME").innerHTML =
        "Hello " + myString + ". Welcome to my site";

        document.getElementById("belong").innerHTML =
        "A place you belong";
    }   
}

// create a function to pass our event too
function myFunction2(event) {   
// variable to make our event short and sweet
var x=window.onbeforeunload;
// logic to make the confirm and alert boxes
if (confirm("Are you sure you want to leave my page?") == true) {
    x = alert("Thank you " + myGlobalNameHolder + " for visiting!");
}
}
1
répondu user2926228 2015-02-19 08:14:04

La normeindique que l'invite peut être contrôlée en annulant l'événementbeforeunload ou en définissant la valeur de retour sur une valeurnon nulle . Il indique également que les auteurs devraient utiliser Event.preventDefault() au lieu de returnValue, et le message affiché à l'utilisateur , n'est pas personnalisable.

À partir de 69.0.3497.92, Chrome n'a pas satisfait à la norme. Cependant, il y a un rapport de bogue déposé, et un examen est en cours. Chrome exige returnValue doit être défini par référence à l'objet event, pas la valeur renvoyée par le gestionnaire.

Il est de la responsabilité de l'auteur de suivre si des modifications ont été apportées; cela peut être fait avec une variable ou en s'assurant que l'événement n'est géré que lorsque cela est nécessaire.

window.addEventListener('beforeunload', function (e) {
    // Cancel the event as stated by the standard.
    e.preventDefault();
    // Chrome requires returnValue to be set.
    e.returnValue = '';
});
    
window.location = 'about:blank';
1
répondu Trevor Karjanis 2018-09-16 22:43:23

Cela peut être facilement fait en définissant un ChangeFlag à true, sur OnChange événement de TextArea. Utilisez javascript pour afficher la boîte de dialogue confirm basée sur la valeur ChangeFlag. Jetez le formulaire et accédez à la page demandée si confirmer renvoie la valeur true else ne rien faire.

0
répondu simplyharsh 2009-07-13 13:08:49

Ce que vous voulez utiliser est l'événement onunload en JavaScript.

Voici un exemple: http://www.w3schools.com/jsref/event_onunload.asp

0
répondu waqasahmed 2011-04-19 19:47:28

Il y a un paramètre "onunload" pour la balise body, vous pouvez appeler les fonctions javascript à partir de là. S'il renvoie false, il empêche de naviguer.

-1
répondu stribika 2009-07-13 13:01:58