J'ai quelques pages avec des formulaires dans ma candidature.
Comment puis-je sécuriser le formulaire de telle manière que si quelqu'un s'éloigne ou ferme l'onglet du navigateur, il doit être invité à confirmer qu'il souhaite vraiment laisser le formulaire avec des données non enregistrées?
javascript
forms
Khan
la source
la source
Réponses:
Réponse courte et fausse:
Vous pouvez le faire en manipulation de l'
beforeunload
événement et en retournant une chaîne non nulle :Le problème avec cette approche est que l' envoi d'un formulaire déclenche également l'événement de déchargement . Ceci est résolu facilement en ajoutant le drapeau que vous soumettez un formulaire:
Puis appeler le passeur lors de la soumission:
Mais lisez la suite ...
Réponse longue et correcte:
Vous ne voulez pas non plus afficher ce message lorsque l'utilisateur n'a rien changé sur vos formulaires . Une solution consiste à utiliser l'
beforeunload
événement en combinaison avec un indicateur "sale", qui ne déclenche l'invite que s'il est vraiment pertinent.Maintenant, pour mettre en œuvre la
isDirty
méthode, il existe différentes approches.Vous pouvez utiliser jQuery et sérialiser un formulaire , mais cette approche présente quelques défauts. Vous devez d'abord modifier le code pour travailler sur n'importe quelle forme (
$("form").each()
fera l'affaire), mais le plus gros problème est que jQueryserialize()
ne fonctionnera que sur les éléments nommés et non désactivés, donc la modification de tout élément désactivé ou non nommé ne déclenchera pas le drapeau sale. Il existe des solutions pour cela , comme rendre les contrôles en lecture seule au lieu d'activer, de sérialiser puis de désactiver à nouveau les contrôles.Les événements semblent donc la voie à suivre. Vous pouvez essayer d' écouter les touches . Cet événement a quelques problèmes:
L'
change
événement a également ne déclenche pas sur les valeurs définies à partir du code JavaScript , donc cela ne fonctionnera pas pour les entrées virtuelles.La liaison de l'
input
événement à tous lesinput
s (ettextarea
s etselect
s) de votre page ne fonctionnera pas sur les anciens navigateurs et, comme toutes les solutions de gestion d'événements mentionnées ci-dessus, ne prend pas en charge l'annulation. Lorsqu'un utilisateur modifie une zone de texte, puis l'annule, ou vérifie et décoche une case à cocher, le formulaire est toujours considéré comme sale.Et lorsque vous souhaitez implémenter plus de comportements, comme ignorer certains éléments, vous aurez encore plus de travail à faire.
Ne réinventez pas la roue:
Donc, avant de penser à mettre en œuvre ces solutions et toutes les solutions de contournement nécessaires, réalisez que vous réinventez la roue et que vous êtes enclin à rencontrer des problèmes que d'autres ont déjà résolus pour vous.
Si votre application utilise déjà jQuery, vous pouvez également utiliser du code testé et maintenu au lieu de lancer le vôtre, et utiliser une bibliothèque tierce pour tout cela. Êtes-vous sûr de jQuery? plugin fonctionne très bien, voir leur page de démonstration . C'est aussi simple que ça:
Messages personnalisés non pris en charge partout
Notez que Firefox 4 ne prend pas en charge les messages personnalisés dans cette boîte de dialogue. Depuis avril 2016, Chrome 51 est déployé dans lequel les messages personnalisés sont également supprimés .
Certaines alternatives existent ailleurs sur ce site, mais je pense qu'un dialogue comme celui-ci est assez clair:
la source
Découvrez l' événement JavaScript onbeforeunload . Il s'agit de JavaScript non standard introduit par Microsoft, mais il fonctionne dans la plupart des navigateurs et leur documentation onbeforeunload contient plus d'informations et d'exemples.
la source
via jquery
Vous pouvez utiliser la fonction de sérialisation du formulaire Google JQuery, cela collectera toutes les entrées du formulaire et l'enregistrera dans le tableau. Je suppose que cela explique assez :)
la source
Solution universelle ne nécessitant aucune configuration qui détecte automatiquement toutes les modifications d'entrée, y compris les éléments modifiables par le contenu:
la source
Construit sur l' excellente idée de Wasim A. d'utiliser la sérialisation. Le problème était que l'avertissement était également affiché lors de la soumission du formulaire. Cela a été corrigé ici.
Il a été testé dans Chrome et IE 11.
la source
Sur la base des réponses précédentes, et bricolé à partir de divers endroits dans le débordement de pile, voici la solution que j'ai trouvée qui gère le cas lorsque vous souhaitez réellement soumettre vos modifications:
Il convient de noter que IE11 semble exiger que la
closeEditorWarning
fonction retourneundefined
pour ne pas afficher d'alerte.la source
QC.thisPage.isDirty = false;
êtrewindow.thisPage.isDirty = false;
? De cette façon, il vérifiera si vous soumettez le formulaire et n'affichera pas d'avertissement. Semblait travailler pour mes tests. De plus, la plupart des formulaires ont uninput
plutôt qu'untextarea
. J'ai utilisé ce qui suit qui fonctionne plutôt bien:$("form").on('keyup', 'textarea,input,select', function () {
Le one-liner suivant a fonctionné pour moi.
Il suffit de définir
modified
à vrai ou faux en fonction de l'état de votre application.la source
undefined
plutôtnull
qu'IE affichera «null» s'ilmodified
est faux.Le code suivant fonctionne très bien. Vous devez atteindre les modifications d'entrée de vos éléments de formulaire via l'attribut id:
la source
la source
Vous pouvez utiliser serialize () pour créer une chaîne de texte codée URL en sérialisant les valeurs du formulaire et vérifier si le formulaire a changé avant le déchargement
Référez-vous à ce lien https://coderwall.com/p/gny70a/alert-when-leaving-page-with-unsaved-form Écrit par Vladimir Sidorenko
la source
serialize()
, et en effet, il a ses inconvénients.En ajoutant à l'idée de @codecaster, vous pouvez l'ajouter à chaque page avec un formulaire (dans mon cas, je l'utilise de manière globale, donc seuls les formulaires auraient cet avertissement) changer sa fonction en
Mettez également sur les formulaires soumettre, y compris la connexion et dans les liens des boutons d'annulation, donc lorsque la personne appuie sur annuler ou soumettre le formulaire ne déclenchera pas l'avertissement également dans chaque page avec un formulaire ...
la source
Vous pouvez vérifier une explication détaillée ici: http://techinvestigations.redexp.in/comparison-of-form-values-on-load-and-before-close/ comparaison-de-form-values-on-load-et -avant-fermer
Le code principal:
la source
Réponse courte:
la source
La solution d'Eerik Sven Puudist ...
... a spontanément fait le travail pour moi dans un cadre complexe orienté objet sans aucun changement nécessaire.
Le seul changement que j'ai appliqué était de faire référence à la forme concrète (une seule forme par fichier) appelée "formForm" ('form' -> '#formForm'):
Le fait que le bouton d'envoi soit «laissé seul» est particulièrement bien fait.
De plus, cela fonctionne pour moi également avec la dernière version de Firefox (en date du 7 février 2019).
la source
Testé la solution universelle d'Eli Grey, n'a fonctionné qu'après avoir simplifié le code pour
Les modifications apportées à la sienne sont supprimées
target[defaultValue]
et ne serventtarget.dataset[defaultValue]
qu'à stocker la valeur par défaut réelle.Et j'ai ajouté un écouteur d'événement «enregistré» où l'événement «enregistré» sera déclenché par vous-même lorsque votre action d'enregistrement aura réussi.
Mais cette solution «universelle» ne fonctionne que dans les navigateurs, pas dans la vue Web de l'application, par exemple, les navigateurs wechat.
Pour le faire fonctionner également (partiellement) dans les navigateurs wechat, une autre amélioration à nouveau:
la source
Je l'ai fait différemment, en partageant ici afin que quelqu'un puisse obtenir de l'aide, testé uniquement avec Chrome.
Je voulais avertir l'utilisateur avant de fermer l'onglet uniquement s'il y a des changements.
Fonctionne bien, mais j'ai un autre problème, lorsque je soumets le formulaire, j'obtiens l'avertissement indésirable, j'ai vu beaucoup de solutions de contournement, c'est parce que onbeforeunload se déclenche avant onsubmit, c'est pourquoi nous ne pouvons pas le gérer dans un événement onsubmit comme
onbeforeunload = null
, mais événement onclick de bouton d'envoi se déclenche avant ces deux événements, j'ai donc mis à jour le codela source
Tout d'abord, la plupart des navigateurs ont cette fonction par défaut. Et pourquoi en avez-vous besoin? Pourquoi ne pas garder le formulaire synchronisé? Je veux dire, enregistrez-le sur toute modification sans attendre la soumission de l'utilisateur. Comme le font les contacts Google. Bien sûr, si seuls tous les champs du formulaire sont obligatoires. Les utilisateurs n'aiment pas quand ils forcent à remplir quelque chose sans avoir la possibilité de penser s'ils en ont besoin. :)
la source
save it on any change without waiting any submitting from user
Vous ne voulez pas toujours faire ça. Parfois, l'utilisateur souhaite apporter de nombreuses modifications, puis vérifier et confirmer qu'il souhaite l'enregistrer.