【发布时间】:2017-09-05 16:56:18
【问题描述】:
我有一个带有选项卡的表单,以及一个简单的函数,用于在用户在表单选项卡之间移动时验证它们。 (使用 jQuery、Bootstrap 和 jquery.validate)
标签验证功能
var validateTab = function(element) {
var _element = $(element);
var validatePane = _element.attr('data-target');
var isValid = $(validatePane + ' :input').valid();
var _li = _element.parent();
// console.log(validatePane + " - " + isValid);
if (isValid) {
_li.removeClass('alert-danger');
_li.addClass('alert-success');
} else {
_li.removeClass('alert-success');
_li.addClass('alert-danger');
}
}; // end function validateTab
我目前正在监听 bootstrap 'hidden.bs.tab' 事件并调用该函数。
// Validate Tab on tab switch.
$(document).on('hidden.bs.tab', 'a[data-toggle="tab"]', function(e) {
validateTab(e.currentTarget);
});
上述工作按预期工作,但我也想在提交表单时这样做。我添加了一个简单的循环来获取每个选项卡并在 jQuery validate 的 invalidHandler() 中调用 validateTab()
invalidHandler: function(event, validator) {
console.log('invalid form');
$('#myForm').append(
'<div class="alert alert-danger alert-dismissable">' +
'<button type="button" class="close" data-dismiss="alert" aria-hidden="true">' +
'×' +
'</button>' +
'<strong>Error: </strong>' +
'<span>Please correct the problems and try again.</span>' +
'</div>'
);
// ADDED THIS CODE AND STARTED RUNNING INTO PROBLEMS.
var $tabs = $('#myTab li a');
$tabs.each(function(key, ele) {
// IF last Tab of form is Valid form submits regardless of other errors.
validateTab(ele);
});
}
这适用于一个例外...当最后一个选项卡有效时,即使其他选项卡上存在错误,表单也会突然提交。似乎调用 valid 会覆盖任何先前的调用或在调用 invalidHandler 之前设置的任何内容。突然,整个表单都提交了,就好像它已经成功验证了一样。
可以在此处找到完整示例。 https://jsfiddle.net/qcean237/1/
目前 TAB 4 上没有验证,因此即使没有提供其他必填字段,每次提交表单都有效。
我应该以不同的方式或在不同的位置验证选项卡以更新提交失败的选项卡外观吗?
谢谢, 内森
【问题讨论】:
-
确实如此,直到在最后一个选项卡上调用 valid() 为止。当最后一个选项卡验证整个表单时,以某种方式被认为是有效的。从 invalidHandler() 内部调用 valid() 感觉很脏,但到目前为止我想出的只是这些。
-
“从
invalidHandler()内部调用valid()感觉很脏” ~ 这就是你的根本问题。
标签: javascript jquery forms jquery-validate