如何使用 jQuery Validate 正确验证放置在多个选项卡上的 Twitter 引导表单?

Posted

技术标签:

【中文标题】如何使用 jQuery Validate 正确验证放置在多个选项卡上的 Twitter 引导表单?【英文标题】:How to properly validate Twitter's Bootstrap form placed on several tabs with jQuery Validate? 【发布时间】:2012-04-26 01:42:56 【问题描述】:

我在几个 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>

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

请查看this demo(只需按下按钮下一步 - 它会显示错误消息,然后转到最后一个选项卡并在那里按完成)。

【问题讨论】:

【参考方案1】:

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

阅读此issue,我们在 1.9 版中看到了这一点

已修复 #189 - :hidden 元素现在默认被忽略

还有一个解决方案,几厘米下来

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

【讨论】:

一个非常简单/天真的方法是找到第一个带有错误类的元素 -> 获取包含它的选项卡 -> 切换到选项卡。但这是另一个问题,有人可能会更好地回答【参考方案2】:

我启用标签的解决方案

...
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
);

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

.tabs( "enable" , index )

阅读更多here。

您还可以将一种最终验证方法放在最后,并根据选项卡将所有内容显示出来,这样您就可以避免重新加载链接。

【讨论】:

我使用 Twitter Bootstrap 及其标签 - twitter.github.com/bootstrap/javascript.html#tabs【参考方案5】:

在@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
);

【讨论】:

不错,我只在$('a[href="#' + id + '"]').tab('show'); 部分之后添加了return false;,因为我遇到了2+ 个标签的问题【参考方案6】:

不完全是 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 触发无效事件的情况。

【讨论】:

以上是关于如何使用 jQuery Validate 正确验证放置在多个选项卡上的 Twitter 引导表单?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery验证插件 Validate详解

jquery.validate 当验证正确之后为啥错误信息没有移除?

使用tooltip显示jquery.validate.unobtrusive验证信息

Jquery Plugins Jquery Validate

jquery.validate 的ajax验证(转)

为啥使用jquery validate进行表单验证时不能显示提示信息????