jQuery Validate 不适用于 Bootstrap 3 选项卡式表单

Posted

技术标签:

【中文标题】jQuery Validate 不适用于 Bootstrap 3 选项卡式表单【英文标题】:jQuery Validate not working on Bootstrap 3 tabbed form 【发布时间】:2013-12-31 23:16:16 【问题描述】:

我看过这个question/answer,还有更多类似的,但我仍然无法让我的表单验证切换标签或移动到出现错误的标签。

相关的jQuery:

$(document).ready(function () 

$("form[name=modify]").validate(
    ignore: [],
    rules: 
        first_name: 
            required: true,
        ,
        surname: 
            required: true
        ,
        id_number: 
            required: true
        ,
        mobile_number: 
            number: true,
            minlength: 10,
        ,
        home_number: 
            number: true,
            minlength: 10,
        ,
        other_contact: 
            number: true,
            minlength: 10,
        ,
        line1: 
            required: true,
        ,
        city_town: 
            required: true,
        ,
        postal_code: 
            required: true,
            minlength: 4,
        ,
        curr_renumeration: 
            required: true,
            number: true,
        ,
        expect_renumeration: 
            required: true,
            number: true
        ,
        email: 
            email: true,
            required: true,
        ,
        highlight: function (label) 
            $(label).closest('.control-group').addClass('has-error');
            console.log($(label).closest('.control-group').addClass('has-error'));
            if ($(".tab-content").find("div.tab-pane.active:has(div.has-error)").length == 0) 
                $(".tab-content").find("div.tab-pane:hidden:has(div.has-error)").each(function (index, tab) 
                    var id = $(tab).attr("id");

                    $('a[href="#' + id + '"]').tab('show');
                );
                $('#myTab').on('shown', function (e) 
                    console.log(this);
                    e.target // activated tab
                    $($(e.target).attr('href')).find("div.has-error :input:first").focus();
                );
            
        ,
    
);
$("[type=submit]").submit(function (e) 
    e.preventDefault();

);

);

您可以查看here

我错过了什么?

有人可以帮我吗?我无法让它工作。

更新:

好的,所以我移动了一些代码并玩了一下:

$("form[name=modify]").validate(
        highlight : function(label) 
            $(label).closest('.form-group').addClass('has-error');
            $(".tab-content").find("fieldset.tab-pane:has(has-error)").each(function(index, tab) 
                alert("error from if");
                if ($(".tab-content").find("field.tab-pane.active:has(has-error)").length == 0) 
                    alert("error from each");
                    var id = $(tab).attr("id");
                    console.log(id);
                    $('a[href="#' + id + '"]').tab('show');
                

            );
        ,
        invalidHandler : function(event, validator) 
            // 'this' refers to the form
            $('#myTab').on('shown', function(e) 
                console.log(this);
                e.target;// activated tab
                $($(e.target).attr('href')).find("fieldset.has-error :input:first").focus();
            );
            var errors = validator.numberOfInvalids();
            if (errors) 
                var message = errors == 1 ? 'You missed 1 field. It has been highlighted' : 'You missed ' + errors + ' fields. They have been highlighted';
                $("div.has-error span").html(message);
                $("div.has-error").show();
             else 
                $("div.has-error").hide();
            
        ,
        ignore : [],
        rules : 
            first_name : 
                required : true,
            ,
            surname : 
                required : true
            ,
            id_number : 
                required : true
            ,
            mobile_number : 
                number : true,
                minlength : 10,
            ,
            home_number : 
                number : true,
                minlength : 10,
            ,
            other_contact : 
                number : true,
                minlength : 10,
            ,
            line1 : 
                required : true,
            ,
            city_town : 
                required : true,
            ,
            postal_code : 
                required : true,
                minlength : 4,
            ,
            curr_renumeration : 
                required : true,
                number : true,
            ,
            expect_renumeration : 
                required : true,
                number : true
            ,
            email : 
                email : true,
                required : true,
            ,

        
    );

一切正常,除了停在这一行if ($(".tab-content").find("field.tab-pane.active:has(has-error)").length == 0)

如果我用$(".tab-content").find("fieldset.tab-pane:has(has-error)").each(function(index, tab) 交换它,它也会停止...

更新jsFiddle

为什么不进入 .each 或 thif

【问题讨论】:

【参考方案1】:

我认为您的问题可能是默认情况下 jquery 只会验证可见字段。所以你需要做的是告诉 jquery 不要忽略你的隐藏字段(其他选项卡)。这可以按如下方式完成。

$("#form1").validate( ignore: "" );

默认情况下,忽略:hidden。请参阅此答案和此文档(选项 -> 忽略)。

【讨论】:

太好了,很高兴这对您有所帮助【参考方案2】:
$("form").on('submit', function () 
    var isValid = $(this).valid();
    if (this.hasChildNodes('.nav.nav-tabs')) 
        var validator = $(this).validate();
        $(this).find("input").each(function () 
            if (!validator.element(this)) 
                isValid = false;
                $('a[href=#' + $(this).closest('.tab-pane:not(.active)').attr('id') + ']').tab('show');
                return false;
            
        );
    
    if (isValid) 
        // do stuff
    
);

【讨论】:

【参考方案3】:

所以...

我的问题已经解决了……

我不得不稍微调整一下answer。

我的解决方案是:

在我的$("form[name=modify]").validate() 中,我调用了一个名为highlight 的函数,

我没有使用$(".tab-content"),而是使用参数label来创建一个变量:

var tab_content=$(label).parent().parent().parent().parent().parent().parent().parent();

也许不是最有效的方法,也不是最好的方法……但它确实有效……

我还从这一行中删除了:hidden

$(".tab-content").find("div.tab-pane:hidden:has(div.has-error)").each(function(index, tab)

这是完整的功能:

        $("form[name=modify]").validate(
        highlight : function(label) 
            $(label).closest('.form-group').addClass('has-error');
            var tab_content= $(label).parent().parent().parent().parent().parent().parent().parent();
            if ($(tab_content).find("fieldset.tab-pane.active:has(div.has-error)").length == 0)                    
                 $(tab_content).find("fieldset.tab-pane:has(div.has-error)").each(function (index, tab) 
                    var id = $(tab).attr("id");
                $('a[href="#' + id + '"]').tab('show');
                 );
             
          ,
            ignore : [], // <-- this is important
            rules : 
                first_name : 
                    required : true,
                ,
                surname : 
                    required : true
                ,
                id_number : 
                    required : true
                ,
                mobile_number : 
                    number : true,
                    minlength : 10,
                ,
                home_number : 
                    number : true,
                    minlength : 10,
                ,
                other_contact : 
                    number : true,
                    minlength : 10,
                ,
                line1 : 
                    required : true,
                ,
                city_town : 
                    required : true,
                ,
                postal_code : 
                    required : true,
                    minlength : 4,
                ,
                curr_renumeration : 
                    required : true,
                    number : true,
                ,
                expect_renumeration : 
                    required : true,
                    number : true
                ,
                email : 
                    email : true,
                    required : true,
                ,

            
        );

查看JSFIDDLE

注意:您不需要上面提到的答案中所述的额外功能来交换标签:

// Don't need this 
$('a[data-toggle="tab"]').on('shown.bs.tab', function(e)
    e.target // activated tab

    $($(e.target).attr('href')).find("div.has-error :input:first").focus();

    //e.relatedTarget // previous tab
); 

我不知道为什么,但你不需要它......无论如何我的工作没有它......

我希望这可以帮助某人。

【讨论】:

以上是关于jQuery Validate 不适用于 Bootstrap 3 选项卡式表单的主要内容,如果未能解决你的问题,请参考以下文章

JQuery Validate 不适用于 Bootstrap Carousel 中的表单

jQuery Validate 不适用于 Bootstrap 3 选项卡式表单

jQuery Validate onclick: false 不适用于复选框或选择

:blank 选择器不适用于复选框 jQuery Validate()

Jquery 验证不适用于登台和生产系统

onkeyup 在针对 tinymce 的 jQuery Validate 中不起作用