【问题标题】:Jquery validation multiple tabs, validate one at a time?Jquery验证多个选项卡,一次验证一个?
【发布时间】:2011-08-04 08:24:18
【问题描述】:

我是 jQuery 新手,我正在尝试使用它和验证插件 (http://docs.jquery.com/Plugins/Validation) 创建一个多部分表单,其中包含针对不同部分的多个选项卡。现在我有它,它有多个选项卡,“下一步”按钮切换到下一个选项卡。

我遇到的问题是,当我最终在最后一页上提交时,表单会正确验证,但如果另一页上出现错误,则不会通知用户,并且验证实际上只有在“提交”后才会发生点击。

当我点击“下一步”时,我将如何单独验证每个?我真的不想创建多个表单或跟踪隐藏字段:S 有什么建议吗?

谢谢!

<script type="text/javascript">
$(document).ready(function() {
    //....stuff
    //tabs
    var tabs = $("#tabs").tabs();
    $(".nexttab").click(function() {
        //var selected = $("#tabs").tabs("option", "selected");
        //$("#tabs").tabs("option", "selected", selected + 1);
        $("#tabs").tabs("select", this.hash);
    });

    //use link to submit form instead of button
    $("a[id=submit]").click( function(){
        $(this).parents("form").submit();
    });

    //form validation
    var validator = $("#myForm").validate();    
});
</script>

<form class="cmxform" id="myForm" method="post" action="">
    <div id="tabs">
        <ul>
            <li><a href="#general">General</a></li>
            <li><a href="#tab2"></a></li>
        </ul>

        <div id="general">
             ....stuff...
            <p>
                <a class="nexttab navbutton" href="#tab2"><span>Next</span></a>  
            </p>
        </div>
        <div id="tab2">
            <h2>Tab2</h2>
            <p>
                <a class="nexttab navbutton" href="#general"><span>Prev</span></a>
                <a class="submit navbutton" id="submit" href="#"><span>Submit</span></a>
            </p>
        </div>
    </div>
</form>

编辑:

@安德鲁:

我对您的第二个示例和禁用选项卡做了一些组合。似乎工作,除了刷新页面重新禁用选项卡。

var tabs = $("#tabs").tabs({

    disabled: [1,2,3,4,5],

    select: function(event, ui) {
        var valid = true;
        var current = $(this).tabs("option", "selected");
        var panelId = $("#tabs ul a").eq(current).attr("href");

        if(ui.index > current)
        {
            $(panelId).find("input").each(function() {
                //console.log(valid);

                if (!validator.element(this) && valid) {
                    valid = false;
                }
            });

        }

        return valid;
    }   

});

结合:

$(".nexttab").click(function() {
    var selected = $("#tabs").tabs("option", "selected");
    $("#tabs").tabs("enable", selected+1);
    $("#tabs").tabs("option", "selected", selected + 1);
});

【问题讨论】:

    标签: javascript jquery forms tabs jquery-validate


    【解决方案1】:

    这可以使用validator.element(selector) 函数来实现。您要做的是遍历活动选项卡上的每个元素并在输入上调用该函数。这将依次触发每个元素的验证,显示验证消息。

    $(".nexttab").click(function() {
        var valid = true;
        var i = 0;
        var $inputs = $(this).closest("div").find("input");
    
        $inputs.each(function() {
            if (!validator.element(this) && valid) {
                valid = false;
            }
        });
    
        if (valid) {
            $("#tabs").tabs("select", this.hash);
        }
    });
    

    此外,当用户单击选项卡以转到一组新输入时,您可能希望运行类似的代码,而不是单击“下一步”。

    这是一个工作示例:http://jsfiddle.net/c2y6r/

    更新:这是另一种方法,在无效的表单元素上取消 select 事件:

    var validator = $("#myForm").validate();
    var tabs = $("#tabs").tabs({
        select: function(event, ui) {
            var valid = true;
            var current = $(this).tabs("option", "selected");
            var panelId = $("#tabs ul a").eq(current).attr("href");
    
            $(panelId).find("input").each(function() {
                console.log(valid);
                if (!validator.element(this) && valid) {
                    valid = false;
                }
            });
    
            return valid;
        }
    });
    

    但是,现在您必须考虑允许用户在他们在当前页面中输入无效数据时返回。另一方面,您可以获得将所有验证代码保存在一个函数中的好处,如果用户单击选项卡或您的下一个链接,该函数就会被触发。

    例如:http://jsfiddle.net/c2y6r/1/

    更新 2,如果你想让人们通过标签界面向后导航:

    var tabs = $("#tabs").tabs({
        select: function(event, ui) {
            var valid = true;
            var current = $(this).tabs("option", "selected");
            var panelId = $("#tabs ul a").eq(current).attr("href");
    
            if (ui.index > current) {
    
                $(panelId).find("input").each(function() {
                    console.log(valid);
                    if (!validator.element(this) && valid) {
                        valid = false;
                    }
                });
            }
    
            return valid;
        }
    });
    

    【讨论】:

    • 嗯,谢谢伙计!除了你提到的问题,第二种方法会很好。也许有一种方法可以找到选项卡的顺序,如果点击的 id 小于/在当前选项卡之前,那么无论如何都返回 true。我可能会采用第一种方式,然后最初禁用右侧的选项卡,直到第一次访问它。关于如何做到这一点的任何建议?
    • @Jordan:您始终可以确定导航到的索引是否小于当前选项卡索引(对于方法 2,我将更新示例)。但是,无论哪种情况,您还必须考虑当用户从一个选项卡单击到另一个选项卡并跳过一些包含必填字段的选项卡时发生的交互。在这种情况下会发生什么?也许您应该一次只允许用户前进一个标签。
    • 是的,我想阻止用户最初跳转到另一个选项卡,但我不介意他们在到达/解锁选项卡后跳转到选项卡。示例#2会这样做吗?要考虑的另一件事是人们是否刷新页面或其他内容。谢谢:)
    • @Jordan:差不多。第二次更新只会让你倒退。通过跟踪用户导航到的最高标签索引,您可以很容易地扩展它以允许人们转到标签&lt;= 到编号最高的标签。
    • @AndrewWhitaker 感谢您的回答。它仅适用于 input 标签。你能更新你的答案以使用selection (dropdown)checkbox 吗?
    【解决方案2】:

    现有的代码对我不起作用(也许它已经过时了)所以我想出了以下内容。此示例假设使用 jquery 选项卡和 jquery 验证器。

    $('#tabs').tabs(
    {
        beforeActivate: function( event, ui )
        {   
            var valid = $("#myForm").valid();
            if (!valid) {
                validator.focusInvalid();
                return false;
            }
            else
                return true;
        }
    });
    

    【讨论】:

    • @MarceloAgimóvel 你在用这个插件吗link
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多