jQuery 验证,在提交时显示 valid/invalid 个表单选项卡

jQuery Validation, displaying valid/invalid form tab(s) on submit

我有一个带有选项卡的表单,以及一个简单的函数,用于在用户在它们之间移动时验证表单选项卡。 (使用 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 的 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">' +
    '&times;' +
    '</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 没有验证,因此即使提供了 none 个其他必填字段,每次提交表单都有效。

我是否应该以不同的方式或在不同的地方验证选项卡以更新失败提交时的选项卡外观?

谢谢, 内森

invalidHandler仅在表单无效时触发,submitHandler仅在表单有效时触发。也就是说,您的 validateTab() 函数也会通​​过调用 .valid() 来触发验证。换句话说,当 invalidHandler 已经知道表单无效时,你通过让 invalidHandler 检查有效性来破坏插件......这是你失败的根源。 invalidHandlersubmitHandler 仅在 有效性确定后被调用...不能同时调用,否则它无法知道应该触发哪个处理程序。

无论如何,只需 运行 validateTab() 单击按钮...

$('button').on('click', function() {
    var $tabs = $('#myTab li a');
    $tabs.each(function(key, ele) {
        validateTab(ele);
    });
});

演示:https://jsfiddle.net/qcean237/2/

您不需要在 invalidHandler 中验证每个选项卡的代码。由于当您提交表单时选项卡已经在表单内,所有内容都会得到验证。

只需从 invalidHandler

中删除以下行
 $tabs.each(function(key, ele) {
   validateTab(ele);
 });

这是删除上述内容后的 fiddle,一切正常。