85 votes

Comment gérer un changement de formulaire en jQuery ?

Dans jQuery, existe-t-il un moyen simple de tester si cualquier des éléments d'un formulaire ont changé ?

Disons que j'ai un formulaire et que j'ai un bouton avec le texte suivant click() événement :

$('#mybutton').click(function() {
  // Here is where is need to test
  if(/* FORM has changed */) {
     // Do something
  }
});

Comment puis-je tester si le formulaire a été modifié depuis son chargement ?

1 votes

Voulez-vous dire par l'action d'un autre script inclus dans la page ou dès que l'utilisateur a tapé du texte ou cliqué sur une radio/case à cocher ?

0 votes

J'aurais dû ajouter que je n'ai besoin de vérifier que lors d'un événement click().

146voto

Nick Craver Points 313913

Vous pouvez le faire :

$("form :input").change(function() {
  $(this).closest('form').data('changed', true);
});
$('#mybutton').click(function() {
  if($(this).closest('form').data('changed')) {
     //do something
  }
});

Cela permet d'installer un change pour les entrées du formulaire, si l'une d'entre elles change, il utilise la fonction .data() pour définir un changed à la valeur true alors nous vérifions simplement cette valeur au moment du clic, ce qui suppose que #mybutton est à l'intérieur du formulaire (sinon, il suffit de remplacer $(this).closest('form') con $('#myForm') ), mais vous pourriez le rendre encore plus générique, comme ceci :

$('.checkChangedbutton').click(function() {
  if($(this).closest('form').data('changed')) {
     //do something
  }
});

Références : Mise à jour de

Selon jQuery, il s'agit d'un filtre permettant de sélectionner tous les contrôles de formulaire.

http://api.jquery.com/input-selector/

Le sélecteur :input sélectionne essentiellement tous les contrôles de formulaire.

7 votes

Fait $('form :input') pour les types de saisie select, textarea et autres ? ou est-ce spécifique à la balise input ?

6 votes

Corrigez-moi si je me trompe, mais il semble que cette méthode dira que le formulaire a été modifié, même si quelqu'un fait une modification et ensuite "annule" sa modification, en revenant manuellement aux valeurs originales du formulaire. Dans ce cas, le formulaire n'aurait pas vraiment changé par rapport aux données, mais cette méthode dirait qu'il l'a fait.

0 votes

@paul c'est correct, vous pourriez sérialiser le formulaire au démarrage de la page et le comparer à une sérialisation actuelle si vous voulez voir s'il y a un changement net - c'est juste plus compliqué que pour les besoins de la plupart des gens.

52voto

Udi Points 6298

Si vous voulez vérifier si les données du formulaire, telles qu'elles vont être envoyées au serveur, ont changé, vous pouvez sérialiser les données du formulaire au chargement de la page et les comparer aux données actuelles du formulaire :

$(function() {

    var form_original_data = $("#myform").serialize(); 

    $("#mybutton").click(function() {
        if ($("#myform").serialize() != form_original_data) {
            // Something changed
        }
    });

});

5 votes

Excellent, c'est la meilleure solution qui existe. Merci.

3 votes

J'ai utilisé cette méthode une fois, et elle est devenue très lente lorsque le formulaire est devenu plus grand. C'est une bonne méthode pour les petites formes, mais ce n'est pas celle qu'il faut utiliser pour les grandes formes.

0 votes

Voulez-vous dire des formulaires avec des fichiers dedans ?

34voto

Marcio Simao Points 2039

Une solution simple et rapide :

$('form').on('keyup change paste', 'input, select, textarea', function(){
    console.log('Form changed!');
});

1 votes

Très bonne solution. Convient pour la validation des formulaires de type "as you type".

1 votes

La meilleure solution pour moi ! Merci beaucoup.

3 votes

Envisagez d'utiliser 'input' au lieu de 'keyup change' pour gérer le collage par le bouton droit de la souris, sauf si vous devez prendre en charge des navigateurs plus anciens.

10voto

Joe D Points 588

Vous pouvez utiliser plusieurs sélecteurs pour joindre une fonction de rappel à l'événement de modification de tout élément de formulaire.

$("input, select").change(function(){
    // Something changed
});

EDIT

Puisque vous avez mentionné que vous n'en avez besoin que pour un clic, vous pouvez simplement modifier mon code original comme suit :

$("input, select").click(function(){
    // A form element was clicked
});

EDIT #2

Ok, vous pouvez définir un global qui est défini une fois que quelque chose a été modifié comme ceci :

var FORM_HAS_CHANGED = false;

$('#mybutton').click(function() {
    if (FORM_HAS_CHANGED) {
        // The form has changed
    }
});

$("input, select").change(function(){
    FORM_HAS_CHANGED = true;
});

3voto

Pez Cuckow Points 5425

En regardant la question mise à jour, essayez quelque chose comme

$('input, textarea, select').each(function(){
    $(this).data("val", $(this).val());
});
$('#button').click(function() {
    $('input, textarea, select').each(function(){
        if($(this).data("val")!==$(this).val()) alert("Things Changed");
    });
});

Pour la question originale, utilisez quelque chose comme

$('input').change(function() {
    alert("Things have changed!");
});

0 votes

Cela ne vérifie pas <textarea> o <select> éléments.

0 votes

Après votre modification... cela semble être beaucoup de travail supplémentaire et de données déplacées, tout ce dont vous avez besoin est une boolean mis à true quand un changement se produit. De plus, ce n'est toujours pas spécifique au formulaire, que se passe-t-il s'il y a d'autres formulaires dans la page ?

0 votes

+1 c'est un bon, mais il a besoin d'un peu de travail, le lier à la forme et le fixer init.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X