La façon dont j'ai fait cela est d'utiliser javascript pour stocker les valeurs initiales des entrées lorsque la page se charge. Ensuite, j'ai un gestionnaire beforeunload qui vérifie si l'une des entrées a une valeur différente que lorsque la page a été chargée. Si des entrées sont modifiées, l'utilisateur est invité à confirmer qu'il souhaite quitter la page, annulant ainsi l'action s'il annule. Dans ma logique de soumission, je mets un drapeau qui empêche la vérification de beforeunload de se produire, donc une soumission ne reçoit pas l'invite.
Je suppose qu'il existe un plugin jQuery pour cela, mais je ne l'ai pas implémenté depuis que j'ai commencé à utiliser jQuery. Mon code précédent utilisait Prototype.
Modifier: Impossible de trouver un plugin jQuery, mais je pourrais l'avoir raté. Voici un exemple de comment je pourrais le faire. Évidemment, il y a plus à faire. Note: Je n'ai pas réussi à l'utiliser avec jQuery pur - je ne sais pas exactement pourquoi, le popup apparaîtrait deux fois.
Cela devrait fonctionner avec tous les éléments d'entrée. Vous pourriez vouloir le changer pour ignorer/manipuler des boutons, cependant. Je l'ai seulement ajusté pour ignorer un bouton de soumission (ainsi il peut poster en arrière sans le popup). Si d'autres types de boutons peuvent entraîner le déchargement d'une page, vous devrez peut-être y remédier.
var CheckOnClose = function() {
this.initialize();
}
CheckOnClose.prototype = {
submitting: false,
initialize: function() {
var that = this;
window.onbeforeunload = function() { return that.checkLeavePage(); }
},
isChanged: function() {
var changed = false;
$('input:not(:submit)').each(function() {
var iv = $(this).data('initialValue');
if ($(this).val() != iv) {
changed = true;
return false;
}
});
return changed;
},
setSubmitting: function() {
this.submitting = true;
},
checkLeavePage: function() {
if (!this.submitting && this.isChanged()) {
return 'You have some unsaved changes.';
}
}
}
var checker = new CheckOnClose();
$(document).ready(function() {
$(':input:not(:submit)').each(function() {
$(this).data('initialValue',$(this).val());
});
$(':submit').click(function() {
checker.setSubmitting();
});
});
Bien sûr, les bibliothèques jQuery/Prototype/other peuvent également être utilisées, mais l'implémentation de base est aussi simple que l'extrait ci-dessus. – synhershko