J'ai une exigence pour implémenter une invite «Changements non enregistrés» dans une application ASP .Net. Si un utilisateur modifie des contrôles sur un formulaire Web et tente de s'en éloigner avant d'enregistrer, une invite doit apparaître pour l'avertir qu'il a des modifications non enregistrées et lui donner la possibilité d'annuler et de rester sur la page en cours. L'invite ne doit pas s'afficher si l'utilisateur n'a touché aucune des commandes.
Idéalement, j'aimerais l'implémenter en JavaScript, mais avant de suivre la voie du déploiement de mon propre code, existe-t-il des cadres existants ou des modèles de conception recommandés pour y parvenir? Idéalement, j'aimerais quelque chose qui puisse facilement être réutilisé sur plusieurs pages avec des modifications minimes.
la source
Réponses:
Utilisation de jQuery:
Combinez avec
onunload
/onbeforeunload
methods au besoin.À partir des commentaires, ce qui suit fait référence à tous les champs de saisie, sans dupliquer le code:
Utiliser
$(":input")
fait référence à tous les éléments input, textarea, select et button.la source
change
pour les entrées de texte, les déclencheurs se déclenchent une fois en quittant / perdant le focus, alors que lesinput
déclencheurs à chaque frappe. (Je l'utilise généralementchange
avec JQueryone()
, afin d'éviter plusieurs événements.)Une pièce du puzzle:
Et un autre :
Enveloppez tout cela et qu'obtenez-vous?
Vous voudrez probablement également modifier l'enregistrement du
beforeunload
gestionnaire d'événements pour utiliserLIBRARY_OF_CHOICE
l'enregistrement d'événements de.la source
onclick="window.onbeforeunload=null"
)Dans la page .aspx, vous avez besoin d'une fonction Javascript pour dire si les informations du formulaire sont "sales" ou non
et dans le codebehind, ajoutez les déclencheurs aux champs de saisie ainsi que les réinitialisations sur les boutons de soumission / d'annulation ....
la source
Ce qui suit utilise la fonction onbeforeunload et jquery du navigateur pour capturer tout événement onchange. Le service informatique recherche également les boutons d'envoi ou de réinitialisation pour réinitialiser l'indicateur indiquant que des modifications ont eu lieu.
la source
Merci à tous pour vos réponses. J'ai fini par implémenter une solution utilisant JQuery et le plug-in Protect-Data . Cela me permet d'appliquer automatiquement la surveillance à tous les contrôles d'une page.
Il y a cependant quelques mises en garde, en particulier lorsqu'il s'agit d'une application ASP .Net:
Lorsqu'un utilisateur choisit l'option d'annulation, la fonction doPostBack lèvera une erreur JavaScript. J'ai dû mettre manuellement un try-catch autour de l'appel .submit dans doPostBack pour le supprimer.
Sur certaines pages, un utilisateur peut effectuer une action qui effectue une publication sur la même page, mais n'est pas une sauvegarde. Cela entraîne la réinitialisation de toute logique JavaScript, donc il pense que rien n'a changé après la publication lorsque quelque chose a pu avoir. J'ai dû implémenter une zone de texte cachée qui est publiée avec la page et est utilisée pour contenir une simple valeur booléenne indiquant si les données sont sales. Cela persiste dans les publications.
Vous souhaiterez peut-être que certaines publications sur la page ne déclenchent pas la boîte de dialogue, comme un bouton Enregistrer. Dans ce cas, vous pouvez utiliser JQuery pour ajouter une fonction OnClick qui définit window.onbeforeunload sur null.
J'espère que cela sera utile pour quiconque doit mettre en œuvre quelque chose de similaire.
la source
Solution générale Prise en charge de plusieurs formulaires dans une page donnée (il suffit de copier et coller dans votre projet )
Remarque: Cette solution est combinée à partir de solutions d'autres pour créer une solution intégrée générale.
Fonctionnalités:
la source
_isDirty
variable décrite par Aaron Powell. Je n'ai pas vu la nécessité d'ajouter et de supprimer des classes du HTML au lieu de variables dans le javascript.La solution suivante fonctionne pour le prototype (testé dans FF, IE 6 et Safari). Il utilise un observateur de formulaire générique (qui déclenche le formulaire: changé lorsque des champs du formulaire ont été modifiés), que vous pouvez également utiliser pour d'autres choses.
la source
Voici une solution javascript / jquery qui est simple. Il tient compte des "annulations" par l'utilisateur, il est encapsulé dans une fonction pour faciliter l'application, et il ne se trompe pas lors de la soumission. Appelez simplement la fonction et transmettez l'ID de votre formulaire.
Cette fonction sérialise le formulaire une fois lorsque la page est chargée, et à nouveau avant que l'utilisateur quitte la page. Si les deux états du formulaire sont différents, l'invite s'affiche.
Essayez-le: http://jsfiddle.net/skibulk/Ydt7Y/
la source
J'ai récemment contribué à un plugin jQuery open source appelé dirtyForms .
Le plugin est conçu pour fonctionner avec du HTML ajouté dynamiquement, prend en charge plusieurs formulaires, peut prendre en charge pratiquement n'importe quel cadre de dialogue, revient au navigateur avant la boîte de dialogue de déchargement, a un cadre d'aide enfichable pour prendre en charge l'obtention du statut sale des éditeurs personnalisés (un petit plugin MCE est inclus) , fonctionne dans les iFrames, et le statut sale peut être défini ou réinitialisé à volonté.
https://github.com/snikch/jquery.dirtyforms
la source
Détecter les changements de formulaire avec l'utilisation de jQuery est très simple:
la source
J'ai développé la suggestion de Slace ci-dessus, pour inclure la plupart des éléments modifiables et exclure également certains éléments (avec un style CSS appelé "srSearch" ici) de provoquer la définition du drapeau sale.
la source
window.onbeforeunload = unloadPage;
la source
C'est exactement ce que le plugin Fleegix.js
fleegix.form.diff
(http://js.fleegix.org/plugins/form/diff ) a été créé pour. Sérialisez l'état initial du formulaire au chargement en utilisantfleegix.form.toObject
(http://js.fleegix.org/ref#fleegix.form.toObject ) et enregistrez-le dans une variable, puis comparez-le avec l'état actuel en utilisantfleegix.form.diff
on unload. C'est de la tarte.la source
Une méthode , utilisant des tableaux pour contenir les variables afin que les modifications puissent être suivies.
Voici une méthode très simple pour détecter les changements , mais le reste n'est pas aussi élégant.
Une autre méthode assez simple et petite, de Farfetched Blog :
la source
Dans IE document.ready ne fonctionnera pas correctement, il mettra à jour les valeurs d'entrée.
nous devons donc lier l'événement de chargement dans la fonction document.ready qui gérera également le navigateur IE.
ci-dessous est le code que vous devez mettre dans la fonction document.ready.
la source