Avertir l'utilisateur avant de quitter page web avec des modifications non enregistrées
J'ai quelques pages avec des formes dans mon application.
Comment puis-je sécuriser la forme de telle manière que si quelqu'un accède à l'écart ou ferme l'onglet du navigateur, ils devraient être invité à confirmer qu'ils veulent vraiment quitter le formulaire avec des données non enregistrées?
- Voir developer.mozilla.org/en/DOM/window.onbeforeunload
- Cette question devrait avoir la réponse que vous recherchez: stackoverflow.com/questions/1244535/...
- voir stackoverflow.com/questions/140460/...
- Connexes: stackoverflow.com/q/821011/435605
Vous devez vous connecter pour publier un commentaire.
Bref, mauvaise réponse:
Vous pouvez le faire en la manipulation de l'
beforeunload
de l'événement et de retourner une valeur non nulle de la chaîne:Le problème avec cette approche est que la soumission d'un formulaire est également le tir de l'événement unload. Ce problème est résolu facilement en ajoutant le drapeau que vous êtes à la soumission d'un formulaire:
Puis en appelant le setter lors de la soumission:
Mais à lire...
De Long, bonne réponse:
Vous aussi vous ne voulez pas afficher ce message lorsque l'utilisateur n'a pas changé quoi que ce soit sur vos formulaires. Une solution consiste à utiliser la
beforeunload
événement en combinaison avec un indicateur "sale, qui ne déclenche l'invite, si c'est vraiment pertinent.Maintenant à mettre en œuvre la
isDirty
méthode, il existe différentes approches.Vous pouvez utiliser jQuery et la forme de la sérialisation, mais cette approche présente certains défauts. Vous devez d'abord modifier le code fonctionne sur n'importe quelle forme (
$("form").each()
fera), mais le plus grand problème est que jQueryserialize()
ne fonctionne que sur nommé, non-handicapés, des éléments, de sorte qu'un changement de toute désactivé ou non à l'élément ne sera pas déclencher le drapeau sale. Il existe des solutions de contournement pour que, comme la prise de contrôle en lecture seule au lieu de les activer, de la sérialisation et de désactivation du contrôle à nouveau.Donc, les événements semblent le chemin à parcourir. Vous pouvez essayer de à l'écoute des combinaisons de touches. Cet événement a quelques questions:
La
modifier
événement aussi ne pas se déclencher sur des valeurs définies à partir du code JavaScript, afin aussi de ne pas travailler pour des entrées virtuelles.La liaison de l'
entrée
événement à tousentrée
s (ettextarea
s etselect
s) sur votre page ne fonctionne pas sur les navigateurs plus anciens et, comme tous les événements de la manipulation de solutions mentionnées ci-dessus, ne supporte pas l'annuler. Lorsqu'un utilisateur modifie une zone de texte, puis dégrafe que, ou de vérifications et décoche une case à cocher, la forme est toujours considéré comme sale.Et quand vous voulez mettre en œuvre plus de comportement, comme le fait d'ignorer certains éléments, vous aurez encore plus de travail à faire.
Ne pas réinventer la roue:
Donc, avant de penser à la mise en œuvre de ces solutions et à toutes les solutions de contournement, réalisez que vous êtes en train de réinventer la roue et vous avez tendance à courir dans des problèmes que d'autres ont déjà résolu pour vous.
Si votre application utilise déjà jQuery, vous pouvez aussi bien utiliser testé, maintenu code au lieu de roulement de votre propre, et le recours à une tierce partie de la bibliothèque pour tous de ce. jQuery Êtes-Vous Sûr? plugin fonctionne très bien, voir leur page de démonstration. C'est aussi simple que cela:
Messages personnalisés pas pris en charge partout
Ne remarque que Firefox 4 ne prend pas en charge les messages personnalisés dans cette boîte de dialogue. Depuis le mois dernier, google Chrome 51 est en cours de déploiement dans lequel des messages personnalisés sont également supprimés.
Quelques alternatives existent ailleurs sur ce site, mais je pense qu'un dialogue de ce genre est assez clair:
Découvrez le JavaScript événement onbeforeunload. Il est non-JavaScript standard mis en place par Microsoft, mais il fonctionne dans la plupart des navigateurs et leur onbeforeunload documentation a plus d'informations et des exemples.
via jquery
Vous pouvez Google JQuery Formulaire de fonction Serialize, cela permettra de recueillir toutes les entrées d'un formulaire et l'enregistrer dans le tableau. Je suppose que c'expliquer, c'est assez 🙂
Solution universelle ne nécessitant aucune configuration qui détecte automatiquement toutes les entrées de la modification, y compris contenteditable éléments:
Basé sur les réponses précédentes, et bricolé à partir de divers endroits dans le débordement de la pile, voici la solution que j'ai trouvé qui traite le cas lorsque vous souhaitez soumettre vos modifications:
Il est intéressant de noter que IE11 semble exiger que le
closeEditorWarning
fonction renvoieundefined
pour elle de ne pas afficher un message d'alerte.QC.thisPage.isDirty = false;
êtrewindow.thisPage.isDirty = false;
? De cette façon, il va vérifier si vous soumettez le formulaire et ne pas afficher un avertissement. Semblait fonctionner pour mes tests. Aussi, la plupart des formes ont uneinput
plutôt qu'untextarea
. J'ai utilisé le suivant qui fonctionne plutôt bien:$("form").on('keyup', 'textarea,input,select', function () {
Construit sur le haut de Wasim A. s excellente idée d'utiliser la sérialisation. Le problème, c'est que l'avertissement a également été montré que lorsque le formulaire a été soumis. Ce problème a été résolu ici.
Il a été testé sur Chrome et IE 11.
La suite de one-liner qui a fonctionné pour moi.
Juste mis
modified
à vrai ou faux en fonction de l'état de votre demande.undefined
plutôt quenull
que IE les imprimer 'null', simodified
est faux.Code suivant fonctionne très bien. Vous avez besoin pour atteindre vos éléments de formulaire de saisie des modifications via l'attribut id:
Ajoutant à te idée de @codecaster
vous pouvez ajouter à chaque page avec un formulaire (dans mon cas, je l'utilise pour mondial de manière uniquement sur les formes de cette avertir) changement de sa fonction de
Également mis sur les formes soumettre, y compris de connexion et d'en annuler les boutons des liens alors, quand personne appuyez sur annuler ou de soumettre le formulaire ne sera pas déclencher l'avertir également dans chaque page witouth un formulaire...
Vous pouvez cocher la case pour une explication détaillée ici:
http://techinvestigations.redexp.in/comparison-of-form-values-on-load-and-before-close/
comparaison-de-forme-valeurs-sur-charger-et-avant-proche
Le code principal:
Réponse courte:
La solution par Eerik Sven Puudist ...
... spontanément fait le travail pour moi dans un complexe orientée objet sans toutes les modifications nécessaires.
Le seul changement que j'ai appliqué était de se référer à la forme concrète (un seul formulaire par fichier) appelé "formForm" ('form -> '#formForm'):
Particulièrement bien fait, c'est le fait que le bouton "soumettre" est "laissé seul".
En outre, il fonctionne pour moi aussi avec la dernière version de Firefox (à compter de la date du 7 février 2019).
Testé Eli Gris de solution universelle, a travaillé seulement après, j'ai simplifié le code pour
Les modifications de son est supprimé de l'utilisation de
target[defaultValue]
et utiliser uniquementtarget.dataset[defaultValue]
pour stocker la vraie valeur par défaut.Et j'ai ajouté un "sauvé" un écouteur d'événement où le "sauvé" de l'événement sera déclenché par vous-même sur votre action salvifique réussi.
Mais cette "universel" ne fonctionne que dans les navigateurs, pas de travaux en application de la webview, par exemple, wechat navigateurs.
Pour le faire fonctionner dans wechat navigateurs(partiellement) en outre, un autre des améliorations de nouveau:
Tout d'abord, la plupart des navigateurs a cette fonction par défaut.
Et pourquoi avez-vous besoin? Pourquoi ne pas garder la forme synchronisés? Je veux dire, l'enregistrer sur n'importe quel changement, sans attendre une soumission de l'utilisateur. Comme Google Contacts n'. Bien sûr, si seulement tous les champs du formulaire sont obligatoires. Les utilisateurs n'aiment pas quand les force à se remplir de quelque chose, sans la possibilité d'aller loin de penser que si ils en ont besoin. 🙂
save it on any change without waiting any submitting from user
Vous n'avez pas toujours envie de le faire. Parfois, l'utilisateur veut faire beaucoup de changements, puis d'examiner et de confirmer qu'ils veulent sauver.