【问题标题】:Displaying bootstrap 3 tab when validation fails验证失败时显示引导程序 3 选项卡
【发布时间】:2015-02-14 21:35:46
【问题描述】:

我有一个跨多个引导程序 3 选项卡的表单。当我单击提交按钮时,我使用

验证跨选项卡的所有输入字段
$.validator.setDefaults({
    ignore: ""    
});

我使用以下功能显示有错误的选项卡

function LoadTabWithError() {    
    $(".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');
    });    
}

$('#btnSubmit').click(function () {        
    LoadTabWithError();
}

除了一种情况外,一切正常。当我单击提交按钮时,说错误在 tab2 上,它不显示 tab2。它只是验证并在 tab2 中显示错误。当我第二次再次单击提交时,它会转到选项卡 2。

我认为函数 LoadTabWithError();在验证表单之前调用。在哪种情况下我应该调用该函数,以便它从第一次显示正确的选项卡。

【问题讨论】:

  • 将点击功能放入document.ready,使用on-click。可能会有帮助。
  • 你的标签是动态生成的吗?
  • 要找到合适的解决方案,我们需要查看相关的 HTML 标记。按钮的标记是什么样的?你在哪里给.validate()打电话?
  • 没有@Tushar Raj。它们是静态标签。

标签: jquery twitter-bootstrap-3 jquery-validate asp.net-mvc-5


【解决方案1】:

您的 click() 处理程序会干扰 jQuery Validate 插件的正常运行方式。这就是为什么开发人员提供了基于特定事件触发的各种回调函数。

如果您想在单击提交按钮并且表单仍然无效时执行一些特殊操作,例如显示选项卡,那么您可以在 .validate() 方法中使用 the invalidHandler callback option

摆脱任何外部点击处理程序,摆脱您的LoadTabWithError 函数,并在.validate() 中正确利用the available options...

$(document).ready(function() {

    $('#yourForm').validate({ // <- initialize the plugin on this form
        ignore: [],  // <- proper format to set ignore to "nothing"
        invalidHandler:  function(event, validator) {
            $(".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');
            });
        },
        // ... the rest of your validate() options
    });

});

这些选项也可以放在.setDefaults() 中,但是,在这种情况下,当页面上只有一个表单时,.setDefaults() 完全没有意义。在任何情况下,您仍然需要调用 .validate() 方法来初始化表单上的插件,除非您的 ASP 框架已经为您处理此初始化;那你别无选择……

$.validator.setDefaults({
    ignore: [],  // <- proper format to set ignore to "nothing"
    invalidHandler:  function(event, validator) {
        $(".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');
        });
    },
    // ... the rest of your options
});

【讨论】:

  • $('#yourform').validate ({ ignore:[] }) 对我不起作用。而如果我在 $.Validator.setDefaults({ ignore:[] }) 中设置相同的值,则可以正常工作。有什么想法吗?
  • 就我而言,我在验证中设置的任何内容都不起作用。甚至规则。而如果我单独设置规则,它们确实有效。 $("input[type='checkbox'][name='SelectedForumList']").rules('add', { required: true, messages: { required: "Forum is required." } });
  • @vanitha,是的,请重新阅读我提到您的 ASP 框架的部分并说,“除非您的 ASP 框架已经在为您处理此初始化”。这是因为您的框架正在处理.validate() 部分(初始化),所以您只能使用.setDefaults().rules()
  • 好的。但是出现错误时不会触发 invalidHandler 。我在 $.validator.setDefaults({}) 中设置了这个
  • @vanitha,正如已经解释过的,它不会因单个错误而触发...invalidHandler 在您单击提交时触发,而表单仍然无效。否则,如果您无法解决这个问题,请创建一个重现问题的 jsFiddle,以便我们查看。
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多