【问题标题】:.Validate jQuery Validation Plugin not Ignoring Hidden Fields.Validate jQuery 验证插件不忽略隐藏字段
【发布时间】:2015-03-11 00:31:06
【问题描述】:

我是 jQuery 和 .Validate jQuery 验证插件的新手。我正在尝试将其集成到多步骤形式中。基本上,我已经根据用户按下的下一个按钮设置了一个开关,并且希望仅基于此验证表单的特定部分。

当我成功验证表单的第一部分并移至第二个字段集时,下一组字段已经出现验证错误。我尝试禁用这些字段(这会阻止我正在使用的滑块逻辑由于某种原因而无法工作),特别是告诉它按类忽略该字段集并直接声明 ignore: ":hidden" 即使它是默认行为。

我已将遇到问题的代码放在此处的 jsFiddle 中:http://jsfiddle.net/13x7Lbk7/4/(已更新)

这是我的代码中调用表单第一步验证的特定部分:

$(".next").click(function(){

// Initialize form
    var form = $("#frmSignup");

    // Determine which step of the form we're on
    switch($(this).attr("value")) {

            case "step1": 

            $("#frmSignup").validate({
              rules: {
                    txtZipCode: {
                        required: true,
                        number: true,
                        minlength: 5,
                        maxlength: 5,
                    },
                    txtSchoolName: {
                        required: true,
                        minlength: 5,
                    },
                },
                messages: {
                    txtZipCode: {
                        required: "Zip Code Required",
                        number: "Enter a valid 5 digit zip code",
                        minlength: "Enter a valid 5 digit zip code",
                    },
                    txtSchoolName: {
                        required: "School Name Required",
                    },
                },            
            });

            break;
// --- SNIP ---

} // End step switch


    if ($("#frmSignup").valid() == true){

// Fieldset logic is here, see jsFiddle if you're curious

} // End isValid if

}); // End click function

这里是前两个字段集的相关 HTML:

    <fieldset class="fsStep1">
    <h2>Step 1</h2>
    <h3>Information</h3>
    <label for="txtZipCode">Zip Code</label>
    <input type="text" name="txtZipCode" value="" pattern="\d*" id="txtZipCode" required />
    <label for="txtExample">Example Field</label>
    <input type="text" name="txtExample" value="" id="txtExample" required />
    <hr />
    <button name="next" value="step1" class="next action-button">Next</button>
  </fieldset>
  <fieldset class="fsStep2">
    <h2>Step 2</h2>
    <h3>Example</h3>
    <label for="txtInfo">Info</label>
    <input type="text" name="txtInfo" id="txtInfo" value="" pattern="[a-zA-Z -]+" required />
    <label for="txtOther">Other</label>
    <input type="text" name="txtOther" id="txtOther" value="" pattern="[a-zA-Z -]+" required />
    <hr />
    <input type="button" name="previous" class="previous action-button" value="Previous" />
    <button name="next" value="step2" class="next action-button">Next</button>
  </fieldset>

我确定我在这里遗漏了一些愚蠢的东西,但我一直在查看代码、查看文档、搜索网络,而且我整天都在碰壁。请把我从我的谜团中解脱出来,并告诉我究竟为什么我是愚蠢的。 :) 谢谢!

【问题讨论】:

  • 我以为你只有一个隐藏字段未被忽略的问题。但是,您的 jsFiddle 完全损坏了....根本没有验证。请检查错误控制台并修复语法错误。
  • 这就是我遇到的问题。我只是在将 javascript 从我的实时文档复制到 jsFiddle 时犯了一个错误。对此非常抱歉。我添加了您建议的 novalidate 标签,到目前为止的行为是相同的。我会继续关注的。
  • 我没有提出这个建议。 jQuery Validate 插件已经自动动态添加了novalidate 属性。
  • 我也认为进一步简化 jsFIddle 以仅显示导致问题的最少量代码是一个非常好的主意。
  • 你是对的。我对此很陌生,并且在自欺欺人。我现在删除了除了 2 个步骤之外的所有步骤,并取出了所有我能找到的 javascript:jsfiddle.net/13x7Lbk7/4

标签: javascript jquery forms jquery-validate


【解决方案1】:

好的,如果它不喜欢隐藏字段,使用这个技巧隐藏它们

/*Hide all except first fieldset*/
#frmSignup fieldset:not(.shown) {
    height:0;
    overflow:hidden;
    position: absolute;
    top: -9999px;
}

.shown 类添加到您的第一个字段集。

您没有.next 元素,但buttons 名为next

所以将$(".next").click 替换为$("button[name='next']").click

您可以使用if ($("#frmSignup").valid()),而不是if ($("#frmSignup").valid() == true)

您需要删除 HTML 中的 required 属性,因为 hidden 元素尚未填充,因此它们会阻止您进行下一步。让$.validate() 完成这项工作。

JS Fiddle Demo

【讨论】:

  • jQuery Validate 插件将可靠地忽略隐藏字段。当面板显示时,OP 的代码中更有可能触发验证。
  • 非常感谢,谢谢。你是明星。
  • 也谢谢你,Sparky。你对我以错误的方式处理这个问题是完全正确的。我正在放下开关并现在重做。完成后,我将在一个新的、已修复的 jsFiddle 中进行编辑,以防有人为此搜索并需要它。
猜你喜欢
  • 2018-06-21
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多