我有一个表格位于几个Twitter的Bootstrap标签上:
<form id="personal-data" class="form-horizontal">
<div class="tabbable">
<ul id="tab" class="nav nav-tabs">
<li class="active"><a href="#home" data-toggle="tab">Home</a></li>
<li class=""><a href="#profile" data-toggle="tab">Profile</a></li>
<!-- ... -->
</ul>
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="home">
<fieldset>
<div class="control-group">
<div class="controls">
<input type="text" id="field1">
</div>
</div>
</fieldset>
</div>
<div class="tab-pane fade" id="profile">
<fieldset>
<div class="control-group">
<div class="controls">
<input type="text" id="field2">
</div>
</div>
</fieldset>
</div>
当我valid
使用jQuery验证活动选项卡上的表单时,具有无效值的字段位于同一选项卡上,则验证失败(这是正确的)。但是当我在一个选项卡上并且另一个选项卡上的值无效时,验证将返回true
,这是不正确的。我该如何解决?如何在另一个标签上突出显示该字段?
请参阅this demo(只需按下按钮下一步 - 它会显示错误消息,然后转到上一个标签页并按完成)。
答案 0 :(得分:15)
我认为您的问题在于验证仅在可见元素中发生。
阅读此issue,我们在版本1.9上看到了
修正了#189 - 隐藏元素现在默认被忽略
和解决方案一些评论下来
$.validator.setDefaults({
ignore: ""
});
答案 1 :(得分:3)
我启用标签的解决方案
...
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
});
答案 2 :(得分:1)
感谢您的代码解决了我的大部分问题,除了导航到第一个选项卡并出错的部分。我绕过如下:
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
}
});
答案 3 :(得分:0)
您正在使用这些jQuery标签吗?您可以停用所有其他选项卡并逐步激活它们,同时每个表单上的提交数据都通过验证。禁用除构造函数中的第一个以外的所有内容,并在每次验证后启用下一个。
.tabs( "enable" , index )
了解更多here。
您还可以在最后添加一个最终验证方法,并根据选项卡显示所有内容,以便您可以转义重新加载链接。
答案 4 :(得分:0)
以@juanmanuele's answer为基础,这就是我设法使用Bootstrap 3 tabs的方式:
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
});
答案 5 :(得分:0)
不完全是jQuery Validate的解决方案,但您可以在表单元素上使用“invalid”事件,捕获HTML5验证错误,并获取焦点元素,分别找到选项卡窗格并显示它。
我做到了。
$("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触发无效事件。