2010-09-09 12 views
7

He desarrollado un formulario con varios conjuntos de campos para representar los pasos al completar el formulario completo. Los conjuntos de campo se muestran y ocultan al hacer clic con el botón (uno en cada conjunto de campos) pero quiero validar cada conjunto de campos antes de que se muestre el siguiente.JQuery Validar conjuntos de campos individuales

Soy nuevo en JQuery y estoy teniendo un problema. Encontré esta guía (http://encosia.com/2009/11/24/asp-net-webforms-validation-groups-with-jquery-validation/) que me permite validar diferentes conjuntos de campo de forma independiente, pero mi problema es cómo usar esa validación para controlar la presentación y el ocultamiento de los conjuntos de campos relevantes.

pensé que la manera de hacer esto sería la creación de una función de cada evento de clic de los botones, pero me parece que no puede llamar a la función de validar correctamente.

¡Me temo que estoy completamente confundido ahora! ¡¡Ayuda!!

Respuesta

1

Puede escribir una función de validación personalizada para cada conjunto de campos y llamarlo usando la función .keyup. Aquí está un ejemplo:

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(); 
    } 
} 

Esto es, obviamente, pretende ser un ejemplo muy simple, pero ilustra lo que tendrá que hacer el fin de validar su formulario y modifique el DOM en función de la entrada del usuario.

+0

Gracias por su respuesta, veo la lógica en su respuesta, pero no quiero mostrar automáticamente el siguiente conjunto de campos cuando los datos se ingresan en un campo. ¿Puedo vincular la validación de un fieldset a un botón? p.ej. crear una función validateFS1() que devuelve verdadero es el fieldset es válido. –

+0

Sí - puede usar un botón o un enlace - solo inserte un código que diga onClick = "validateFS1()" y use esa función para mostrar el próximo fieldset si la validación devuelve verdadero. – Adam

1

Usando jQuery validation plugin que puede evitar esto al tener múltiples formas en la misma página. A continuación, puede llamar a:

$ ('# myFormId') validar()

en los formularios de interés de uno en el tiempo..

+2

Es bueno saberlo, pero creo que hay una ventaja de tener todos los campos en una sola forma, probablemente más fácil de enviar – Erich

1

me encontré con este ejemplo que se acaba antes de encontrar su pregunta mientras que googlear algo más, esperando que esto ayude a alguien con el mismo problema:

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

Básicamente, al parecer sólo validation.js valida los campos visibles por defecto.

Aquí está el código completo, haga clic a través del enlace para ver la explicación:

<!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> 
Cuestiones relacionadas