2010-09-09 8 views
7

J'ai développé un formulaire avec plusieurs ensembles de champs pour représenter les étapes de remplissage du formulaire complet. Les jeux de champs sont affichés et masqués par un clic sur un bouton (un sur chaque jeu de champs) mais je veux valider chaque jeu de champs avant que le suivant n'apparaisse. Je suis nouveau à JQuery et j'ai un peu de mal. J'ai trouvé ce guide (http://encosia.com/2009/11/24/asp-net-webforms-validation-groups-with-jquery-validation/) qui me permet de valider différents fieldsets de manière indépendante mais mon problème est de savoir comment utiliser cette validation pour contrôler l'affichage et le masquage des fieldsets correspondants.JQuery Valider des ensembles de champs individuels

Je pensais que le moyen de le faire serait de créer une fonction à partir de chaque événement de clic pour les boutons, mais je n'arrive pas à appeler correctement la fonction de validation. J'ai peur que je sois complètement confus maintenant! Aidez-moi!!

Répondre

1

Vous pouvez écrire une fonction de validation personnalisée pour chaque fieldset et l'appeler à l'aide de la fonction .keyup. Voici un exemple:

HTML:

<div id="fieldset1"> 
    <input type="text" name="fname" id="fname"> 
</div> 

<div id="fieldset2"> 
    <!--hidden using css--> 
    <input type="text" name="fname" id="fname"> 
</div> 

Javascript:

$('#fieldset1 #fname').keyup(function() { 
    // Runs every time your keystroke is released on this input 
    if($(this).val() == 'Adam') { 
     // Checks to see if the field's value is Adam. If it is, then it shows the next fieldset. Otherwise it hides it. 
     $('#fieldset2').show(); 
    } else { 
     $('#fieldset2').hide(); 
    } 
} 

Ceci est évidemment conçu comme un exemple très simple, mais il illustre ce que vous devez faire afin de valider votre formulaire et modifier le DOM en fonction de l'entrée de l'utilisateur.

+0

Merci pour votre réponse, je vois la logique dans votre réponse, mais ne veux pas montrer automatiquement la prochaine fieldset lorsque les données sont entrées dans un champ. Puis-je lier la validation d'un fieldset à un bouton? par exemple. créer une fonction validateFS1() qui retourne true si le fieldset est valide. –

+0

Oui - vous pouvez utiliser un bouton ou un lien - insérez simplement du code qui dit onClick = "validateFS1()" et utilisez cette fonction pour afficher le fieldset suivant si la validation retourne true. – Adam

1

En utilisant jQuery validation plugin vous pouvez contourner ce problème en ayant plusieurs formulaires dans la même page. Vous pouvez ensuite appeler:

$ ('# myFormId') valider()

sur les formes d'intérêt un à l'époque..

+2

Bon à savoir, mais je pense qu'il y a un avantage à avoir tous les champs dans un formulaire, probablement plus facile à soumettre – Erich

1

Je suis tombé sur cet exemple juste avant de trouver votre question en googler quelque chose d'autre, en espérant que cela aidera quelqu'un avec le même problème:

https://djaodjin.com/blog/jquery-multi-step-validation.blog.html

Fondamentalement, apparemment validation.js ne valide les champs visibles par défaut.

Voici le code exemple complet, cliquer sur le lien pour voir l'explication:

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
    <title>Multiple step form</title> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> 
    <script type="text/javascript" src="js/jquery-1.9.0.js"></script> 
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.js"></script> 
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/additional-methods.js"></script> 
    <style type="text/css"> 
     #personal_information, 
     #company_information{ 
      display:none; 
     } 
    </style> 
</head> 
<body> 
    <div class="container"> 
     <div class="col-lg-5"> 
      <form class="form-horizontal" action="" method="POST" id="myform"> 

       <fieldset id="account_information" class=""> 
        <legend>Account information</legend> 
        <div class="form-group"> 
         <label for="username" class="col-lg-4 control-label">Username</label> 
         <div class="col-lg-8"> 
          <input type="text" class="form-control" id="username" name="username" placeholder="username"> 
         </div> 
        </div> 
        <div class="form-group"> 
         <label for="password" class="col-lg-4 control-label">Password</label> 
         <div class="col-lg-8"> 
          <input type="password" class="form-control" id="password" name="password" placeholder="Password"> 
         </div> 
        </div> 
        <div class="form-group"> 
         <label for="conf_password" class="col-lg-4 control-label">Confirm password</label> 
         <div class="col-lg-8"> 
          <input type="password" class="form-control" id="conf_password" name="conf_password" placeholder="Password"> 
         </div> 
        </div> 
        <p><a class="btn btn-primary next">next</a></p> 
       </fieldset> 

       <fieldset id="company_information" class=""> 
        <legend>Account information</legend> 
        <div class="form-group"> 
         <label for="company" class="col-lg-4 control-label">Company</label> 
         <div class="col-lg-8"> 
          <input type="text" class="form-control" id="company" name="company" placeholder="Company"> 
         </div> 
        </div> 
        <div class="form-group"> 
         <label for="url" class="col-lg-4 control-label">Website url</label> 
         <div class="col-lg-8"> 
          <input type="text" class="form-control" id="url" name="url" placeholder="Website url"> 
         </div> 
        </div> 
        <p><a class="btn btn-primary next">next</a></p> 
       </fieldset> 

       <fieldset id="personal_information" class=""> 
        <legend>Personal information</legend> 
        <div class="form-group"> 
         <label for="name" class="col-lg-4 control-label">Name</label> 
         <div class="col-lg-8"> 
          <input type="text" class="form-control" id="name" name="name" placeholder="Name"> 
         </div> 
        </div> 
        <div class="form-group"> 
         <label for="email" class="col-lg-4 control-label">Email</label> 
         <div class="col-lg-8"> 
          <input type="email" class="form-control" id="email" name="email" placeholder="Email"> 
         </div> 
        </div> 
        <p><a class="btn btn-primary" id="previous" >Previous</a></p> 
        <p><input class="btn btn-success" type="submit" value="submit"></p> 
       </fieldset> 

      </form> 
     </div> 
    </div> 

    <script type="text/javascript"> 
     $(document).ready(function(){ 

      // Custom method to validate username 
      $.validator.addMethod("usernameRegex", function(value, element) { 
       return this.optional(element) || /^[a-zA-Z0-9]*$/i.test(value); 
      }, "Username must contain only letters, numbers"); 

      $(".next").click(function(){ 
       var form = $("#myform"); 
       form.validate({ 
        errorElement: 'span', 
        errorClass: 'help-block', 
        highlight: function(element, errorClass, validClass) { 
         $(element).closest('.form-group').addClass("has-error"); 
        }, 
        unhighlight: function(element, errorClass, validClass) { 
         $(element).closest('.form-group').removeClass("has-error"); 
        }, 
        rules: { 
         username: { 
          required: true, 
          usernameRegex: true, 
          minlength: 6, 
         }, 
         password : { 
          required: true, 
         }, 
         conf_password : { 
          required: true, 
          equalTo: '#password', 
         }, 
         company:{ 
          required: true, 
         }, 
         url:{ 
          required: true, 
         }, 
         name: { 
          required: true, 
          minlength: 3, 
         }, 
         email: { 
          required: true, 
          minlength: 3, 
         }, 

        }, 
        messages: { 
         username: { 
          required: "Username required", 
         }, 
         password : { 
          required: "Password required", 
         }, 
         conf_password : { 
          required: "Password required", 
          equalTo: "Password don't match", 
         }, 
         name: { 
          required: "Name required", 
         }, 
         email: { 
          required: "Email required", 
         }, 
        } 
       }); 
       if (form.valid() === true){ 
        if ($('#account_information').is(":visible")){ 
         current_fs = $('#account_information'); 
         next_fs = $('#company_information'); 
        }else if($('#company_information').is(":visible")){ 
         current_fs = $('#company_information'); 
         next_fs = $('#personal_information'); 
        } 

        next_fs.show(); 
        current_fs.hide(); 
       } 
      }); 

      $('#previous').click(function(){ 
       if($('#company_information').is(":visible")){ 
        current_fs = $('#company_information'); 
        next_fs = $('#account_information'); 
       }else if ($('#personal_information').is(":visible")){ 
        current_fs = $('#personal_information'); 
        next_fs = $('#company_information'); 
       } 
       next_fs.show(); 
       current_fs.hide(); 
      }); 

     }); 
    </script> 
</body> 
</html> 
Questions connexes