【问题标题】:jQuery Validate array input element which is created dynamicallyjQuery验证动态创建的数组输入元素
【发布时间】:2013-07-13 16:44:14
【问题描述】:

我有一个表格,我想使用the jQuery Validation plugin 进行验证。我目前对使用 jQuery .on() 动态创建的数组 (name="inputname[]") 的输入元素有疑问。让我解释一下这个问题:

  1. 有一个表单,存在一个名为name[] 的输入文本。
  2. 有一个添加更多输入文本的按钮,该元素使用 .on() 执行。我点击了 2 或 3 次,所以输入文本会超过 1 个。
  3. 我点击提交,表单已正确验证,但仅验证第一个创建的数组元素,而不验证另一个元素。

对于完整的代码,我在这里创建了一个 jsfiddle:http://jsfiddle.net/ThE5K/4/

jQuery

$(document).ready(function () {

    // MODE 1
    //   With [] or array name <<<< this one is not working
    $("#addInput").on('click', function () {
        $('#inputs').append($('<input class="comment" name="name[]" />'));
    });


    /* MODE 2
       Without [] or array name <<<< this one is working
       var numberIncr = 1;

        $("#addInput").on('click', function () {
           $('#inputs').append($('<input class="comment" name="name' + numberIncr + '" />'));
           numberIncr++;
       });
    */

    $('form.commentForm').on('submit', function (event) {

        $('input.comment').each(function () {
            $(this).rules("add", {
                required: true
            })
        });

        event.preventDefault();

        console.log($('form.commentForm').valid());
    })

    $('form.commentForm').validate();
});

HTML

<form class="commentForm">
    <div id="inputs"></div>
    <input type="submit" /> 
    <span id="addInput">add element</span>
</form>

我在其中创建了两种模式,一种是工作模式(不带数组名称的动态输入文本),另一种是不工作模式(带数组名称的动态输入文本)。

我一直在研究这些解决方案,但不幸的是没有一个能奏效:

请帮忙。

【问题讨论】:

  • 您在提交表单时添加规则。这都是错误的。您应该在创建新字段后立即添加规则。
  • 请在 OP 中包含足够的代码以创建简洁的演示。您的 OP 应该是完全“独立的”,而不是依赖于外部链接。我已经编辑了你的 OP 以包含完整的代码。

标签: jquery jquery-validate


【解决方案1】:

关于创建新字段的代码:

// Mode 1
$("#addInput").on('click', function () {
    $('#inputs').append($('<input class="comment" name="name[]" />'));
});

您的“模式 1”不起作用的全部原因是您为每个新的 input 分配了相同的名称属性 name="name[]"。 jQuery Validate 插件绝对要求每个input 元素都有一个唯一 name 属性。只需在 name[] 中使用您的 numberIncr 变量来确保此名称的唯一性。

另外,你真的不应该在submit 上添加规则。 submit 事件通常是检查所有规则的地方,因此此时添加规则没有多大意义。创建新输入字段时应添加新规则。

对于您的简单情况,无论如何,rules('add') 方法对于这种情况来说太过分了,您可以完全消除您的 .on('submit') 处理程序。由于规则是required,您可以简单地将class="required" 添加到新的input 元素中。

这是工作代码:

jQuery

$(document).ready(function () {

    // MODE 1
    var numberIncr = 1;
    $("#addInput").on('click', function () {
        $('#inputs').append($('<input class="comment required" name="name[' + numberIncr + ']" />'));
        numberIncr++;
    });

    $('form.commentForm').validate();
});

演示:http://jsfiddle.net/ThE5K/6/

【讨论】:

  • 嗨 Sparky,感谢您的回答和警告。我从来不知道有一个名字[1],名字[2]([]括号内的数字)。但是,首先我需要知道 PHP 是如何处理这个变量的,所以我会尽快尝试你的代码......谢谢。
  • 更新:我正在应用您在我的表单上提出的建议,现在一切正常(并且完美)就像一个魅力。我还能够消除 .on(submit)。谢谢!
  • @user9437856,请不要在其他地方的答案下询问您自己的问题。没有人看到这个对你的项目或“控制器”有任何想法。
  • @Sparky,问这个是因为你标记了我这个问题。
【解决方案2】:
    The validation can be simply done by class name
        <form action="http://xxxx/project/create" class="form-horizontal" id="invoice_form" method="post" accept-charset="utf-8">
            <table>
                <tr>
                    <td><input type="text" name="description[]" class="form-control validate_form" id="description"><span class="error">This field is required.</span></td>

                    <td><input type="text" name="per_litre[]" class="form-control validate_form validate_number per_litre"><span class="error">This field is required.</span><span class="error">Please enter number.</span></td>
                </tr>
                <tr>
                    <td><input type="text" name="description[]" class="form-control validate_form" id="description"><span class="error">This field is required.</span></td>

                    <td><input type="text" name="per_litre[]" class="form-control validate_form validate_number per_litre"><span class="error">This field is required.</span><span class="error">Please enter number.</span></td>
                </tr>
            </table>

            <button type="submit" id="invoice_submit" class="btn btn-primary">Submit</button>
        </form>

Add style to hide error message:
     <style type="text/css">
        .error {
            color: red;
            display: none;
        }
    </style>

 Script for validate form fields by class name

    <script>
        $(document).on('click', '#invoice_submit', function(e){
            e.preventDefault();
            i = 0;
            $(".validate_form").each(function() {
                var selectedTr = $(this);
                var value = $(this).val();
                if (!value) {
                    selectedTr.next("span").show();
                    i++;
                } else {
                    selectedTr.next("span").hide();
                }
            });

            $(".validate_number").each(function() {
                var selectedTr = $(this);
                var value = $(this).val();

                var filter = /^[0-9]+([,.][0-9]+)?$/g;
                if (value != '') {
                    if (!filter.test(value)) {
                        selectedTr.next("span").next("span").show();
                        i++;
                    } else {
                      selectedTr.next("span").next("span").hide();
                    }
                }
            });
            if (i == 0) {
                $('#invoice_form').submit();
            }
        });
    </script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多