Soy nuevo en jQuery y estoy tratando de usarlo y el complemento de validación (http://docs.jquery.com/Plugins/Validation) para crear un formulario de varias partes con varias pestañas para diferentes secciones. Ahora mismo lo tengo donde hay varias pestañas y el botón "Siguiente" cambia a la siguiente pestaña.Jquery validación de múltiples pestañas, validar una a la vez?
El problema que estoy teniendo es que cuando finalmente se presento en la última página, la forma valida correctamente, pero si hay errores en la otra página, el usuario no es notificado, y la validación en realidad sólo ocurre una vez en "enviar" se hace clic.
¿Cómo puedo validar cada uno individualmente cuando hago clic en "Siguiente"? Realmente no quiero crear formularios múltiples ni realizar un seguimiento de los campos ocultos: S ¿Alguna sugerencia?
Gracias!
<script type="text/javascript">
$(document).ready(function() {
//....stuff
//tabs
var tabs = $("#tabs").tabs();
$(".nexttab").click(function() {
//var selected = $("#tabs").tabs("option", "selected");
//$("#tabs").tabs("option", "selected", selected + 1);
$("#tabs").tabs("select", this.hash);
});
//use link to submit form instead of button
$("a[id=submit]").click(function(){
$(this).parents("form").submit();
});
//form validation
var validator = $("#myForm").validate();
});
</script>
<form class="cmxform" id="myForm" method="post" action="">
<div id="tabs">
<ul>
<li><a href="#general">General</a></li>
<li><a href="#tab2"></a></li>
</ul>
<div id="general">
....stuff...
<p>
<a class="nexttab navbutton" href="#tab2"><span>Next</span></a>
</p>
</div>
<div id="tab2">
<h2>Tab2</h2>
<p>
<a class="nexttab navbutton" href="#general"><span>Prev</span></a>
<a class="submit navbutton" id="submit" href="#"><span>Submit</span></a>
</p>
</div>
</div>
</form>
Editar:
@ Andrew:
Hice una cierta combinación de su segundo ejemplo y pestañas incapacitantes. Parece que funciona, además de tener la actualización de la página volver a desactivar las pestañas.
var tabs = $("#tabs").tabs({
disabled: [1,2,3,4,5],
select: function(event, ui) {
var valid = true;
var current = $(this).tabs("option", "selected");
var panelId = $("#tabs ul a").eq(current).attr("href");
if(ui.index > current)
{
$(panelId).find("input").each(function() {
//console.log(valid);
if (!validator.element(this) && valid) {
valid = false;
}
});
}
return valid;
}
});
en combinación con:
$(".nexttab").click(function() {
var selected = $("#tabs").tabs("option", "selected");
$("#tabs").tabs("enable", selected+1);
$("#tabs").tabs("option", "selected", selected + 1);
});
Hmm, thanks mate! El segundo método sería bueno, excepto por el problema que mencionaste.Quizás haya una forma de encontrar el orden de las pestañas y si la identificación que se hace clic es menor que/antes de la pestaña actual, entonces devuelve verdadero de todos modos. Probablemente voy a ir de la primera manera y luego desactivaré las pestañas a la derecha hasta que se acceda por primera vez. ¿Alguna sugerencia sobre cómo hacer eso? – Jordan
@Jordan: siempre se puede determinar si el índice al que se está navegando es menor que el índice de pestañas actual (para el método 2, actualizaré el ejemplo). Sin embargo, en cualquier caso, también debe pensar en la interacción que se produce cuando un usuario hace clic de una pestaña a otra y omite algunas pestañas que contienen campos obligatorios. ¿Qué pasa en este caso? Tal vez solo debería permitir que los usuarios avancen una pestaña a la vez. –
Sí, me gustaría evitar que el usuario salte inicialmente a otra pestaña, pero no me importa que salten a las pestañas una vez que ya hayan alcanzado/desbloqueado la pestaña. ¿El ejemplo 2 lo haría? La otra cosa a considerar es si la gente actualiza la página o algo. Gracias :) – Jordan