如何使用jQuery Validate正确validation放置在几个选项卡上的Twitter的Bootstrap表单?

我有一个表单位于几个Twitter的Bootstrap选项卡上:

当我在活动选项卡上使用jQuery validatevalidation表单时,在同一选项卡上使用无效值的字段,则validation失败(这是正确的)。 但是当我在一个选项卡上并且无效值在另一个选项卡上时,validation返回true ,这是不正确的。 我该如何解决? 如何在另一个标签上突出显示该字段?

请看这个演示 (只需按下按钮 – 它将显示错误信息,然后转到最后一个标签并按完成那里)。

我认为您的问题在于validation仅在可见元素中发生。

阅读本期我们在版本1.9上看到了这个问题

已修复#189 – :隐藏元素现在默认被忽略

并解决了一些评论

 $.validator.setDefaults({ ignore: "" }); 

我的解决方案启用标签

 ... highlight: function(label) { $(label).closest('.control-group').addClass('error'); $(".tab-content").find("div.tab-pane:hidden:has(div.error)").each( function(){ var id = $(this).attr("id"); $('#tabs a[href="#'+id+'"]').tab('show'); }); }, ... 

您需要添加此代码以允许js更改选项卡

 $('a[data-toggle="tab"]').on('shown', function (e) { e.target // activated tab e.relatedTarget // previous tab }); 

感谢您的代码,它解决了我的大多数问题,除了导航到第一个选项卡有错误的部分。 我得到如下:

  var IsValid = true; // Validate Each Bootstrap tab $(".tab-content").find("div.tab-pane").each(function (index, tab) { var id = $(tab).attr("id"); $('a[href="#' + id + '"]').tab('show'); var IsTabValid = $("#SomeForm").valid(); if (!IsTabValid) { IsValid = false; } }); // Show first tab with error $(".tab-content").find("div.tab-pane").each(function (index, tab) { var id = $(tab).attr("id"); $('a[href="#' + id + '"]').tab('show'); var IsTabValid = $("#SomeForm").valid(); if (!IsTabValid) { return false; // Break each loop } }); 

你正在使用这些jQuery标签吗? 您可以停用所有其他选项卡并逐步激活它们,同时每个表单上的提交数据都通过validation。 除了构造函数中的第一个以外,禁用它们,并在每次validation后启用下一个。

 .tabs( "enable" , index ) 

在这里阅读更多。

您还可以在最后放置一个最终validation方法,并根据选项卡显示所有内容,以便您可以转义重新加载链接。

基于@ juanmanuele的回答 ,这就是我设法使用Bootstrap 3标签的方法 :

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

要将焦点放在第一个输入上并显示错误:

 $('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的解决方案,但您可以在表单元素上使用“invalid”事件,捕获HTML5validation错误,并获取焦点元素,分别找到选项卡窗格并显示它。

我做到了这一点。

 $("form").find("input, select").on("invalid", function() { var id = $(this).parents(".tab-pane").attr("id"); $("#tabs-selector ul").find("li a[href='#" + id + "']").tab("show"); }); 

希望这对你有所帮助。 同样,这适用于HTML5或jQuery Validate触发无效事件。