Jquery проверка нескольких вкладок, проверка по одному за раз?

Я новичок в jQuery, и я пытаюсь использовать его и плагин проверки (http://docs.jquery.com/Plugins/Validation) для создания многочастной формы с несколькими вкладками для разных разделов. Сейчас у меня есть место, где есть несколько вкладок, а кнопка "Далее" переключается на следующую вкладку.

Проблема, с которой я столкнулась, заключается в том, что когда я наконец отправляюсь на последнюю страницу, форма проверяется правильно, но если на другой странице есть ошибки, пользователь не уведомляется, и проверка действительно происходит только после того, как "отправить" щелкнул.

Как я могу проверить каждый отдельно, когда я нажимаю "Далее"? Я действительно не хочу создавать несколько форм или отслеживать скрытые поля: S Любые предложения?

Спасибо!

<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>

Edit:

@Андрей:

Я сделал несколько комбинаций вашего второго примера и отключил вкладки. Кажется, что работа, кроме обновления страницы, повторно отключает вкладки.

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

});

В сочетании с:

$(".nexttab").click(function() {
    var selected = $("#tabs").tabs("option", "selected");
    $("#tabs").tabs("enable", selected+1);
    $("#tabs").tabs("option", "selected", selected + 1);
});

Ответ 1

Это возможно с помощью .element(selector) функции validator. То, что вы собираетесь делать, это перебрать каждый элемент на активной вкладке и вызвать эту функцию на входе. Это приведет к проверке на каждом элементе по очереди, показывая сообщение проверки.

$(".nexttab").click(function() {
    var valid = true;
    var i = 0;
    var $inputs = $(this).closest("div").find("input");

    $inputs.each(function() {
        if (!validator.element(this) && valid) {
            valid = false;
        }
    });

    if (valid) {
        $("#tabs").tabs("select", this.hash);
    }
});

Кроме того, вы, вероятно, захотите запустить аналогичный код, когда пользователь нажимает вкладку, чтобы перейти к новому набору входов, вместо нажатия "next".

Вот рабочий пример: http://jsfiddle.net/c2y6r/

Обновление:. Здесь вы можете сделать другой способ, отменив событие select на недопустимые элементы формы:

var validator = $("#myForm").validate();
var tabs = $("#tabs").tabs({
    select: function(event, ui) {
        var valid = true;
        var current = $(this).tabs("option", "selected");
        var panelId = $("#tabs ul a").eq(current).attr("href");

        $(panelId).find("input").each(function() {
            console.log(valid);
            if (!validator.element(this) && valid) {
                valid = false;
            }
        });

        return valid;
    }
});

Однако теперь вам нужно подумать о том, чтобы позволить пользователю вернуться, когда они ввели неверные данные на текущую страницу. С другой стороны, вы получаете бонус за сохранение всего кода проверки внутри одной функции, которая запускается, если человек нажимает на вкладку или следующую ссылку.

Пример: http://jsfiddle.net/c2y6r/1/

Обновить 2, если вы хотите разрешить людям перемещаться назад через интерфейс вкладки:

var tabs = $("#tabs").tabs({
    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;
    }
});

Ответ 2

Существующий код не работал у меня (возможно, он устарел), поэтому я придумал следующее. Этот пример предполагает использование вкладок jquery и проверки подлинности jquery.

$('#tabs').tabs(
{
    beforeActivate: function( event, ui )
    {   
        var valid = $("#myForm").valid();
        if (!valid) {
            validator.focusInvalid();
            return false;
        }
        else
            return true;
    }
});