验证动态添加的输入字段

Validate Dynamically Added Input fields

本文关键字:输入 字段 添加 动态 验证      更新时间:2023-11-27

我已经为以下表单使用了这个jquery验证插件。

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" src="http://jzaefferer.github.com/jquery-validation/jquery.validate.js"></script>
<script>
    $(document).ready(function(){
        $("#commentForm").validate();
    });
    function addInput() {
        var obj = document.getElementById("list").cloneNode(true);
        document.getElementById('parent').appendChild(obj);
    }
</script>
<form id="commentForm" method="get" action="">
    <p id="parent">
        <input id="list"  class="required" />
    </p>
    <input class="submit" type="submit" value="Submit"/>
    <input type="button" value="add" onClick="addInput()" />
</form>

当单击添加按钮时,将动态添加新的输入。但是,当提交表单时,仅验证第一个输入字段。如何验证动态添加的输入?非常感谢。

您的输入应该具有"name"属性。您需要动态添加规则,一种选择是在表单提交时添加规则。

这是我测试过的有效解决方案:

<script type="text/javascript">
   $(document).ready(function() {
        var numberIncr = 1; // used to increment the name for the inputs
        function addInput() {
            $('#inputs').append($('<input class="comment" name="name'+numberIncr+'" />'));
            numberIncr++;
        }
        $('form.commentForm').on('submit', function(event) {
            // adding rules for inputs with class 'comment'
            $('input.comment').each(function() {
                $(this).rules("add", 
                    {
                        required: true
                    })
            });            
            // prevent default submit action         
            event.preventDefault();
            // test if form is valid 
            if($('form.commentForm').validate().form()) {
                console.log("validates");
            } else {
                console.log("does not validate");
            }
        })
        // set handler for addInput button click
        $("#addInput").on('click', addInput);
        // initialize the validator
        $('form.commentForm').validate();
   });

</script>

以及html表单部分:

<form class="commentForm" method="get" action="">
    <div>
        <p id="inputs">    
            <input class="comment" name="name0" />
        </p>
    <input class="submit" type="submit" value="Submit" />
    <input type="button" value="add" id="addInput" />
    </div>
</form>

祝你好运!如果答案适合您,请批准!

添加新字段后重置表单验证。

function resetFormValidator(formId) {
    $(formId).removeData('validator');
    $(formId).removeData('unobtrusiveValidation');
    $.validator.unobtrusive.parse(formId);
}

添加动态内容后,您需要重新解析表单,以验证内容

$('form').data('validator', null);
$.validator.unobtrusive.parse($('form'));

发布的一个mahesh不起作用,因为缺少属性名称:

所以不是

<input id="list" class="required"  />

您可以使用:

<input id="list" name="list" class="required"  />

修改版本

jquery验证插件版本运行良好v1.15.0,但V117.0不适用于我。

$(document).find('#add_patient_form').validate({
          ignore: [],
          rules:{
            'email[]':
            {
              required:true,
            },               
          },
          messages:{
            'email[]':
            {
              'required':'Required'
            },            
          },    
        });

关于@RitchieD响应,如果您使用jQuery,这里有一个jQuery插件版本可以让事情变得更容易。

(function ($) {
    $.fn.initValidation = function () {
        $(this).removeData("validator");
        $(this).removeData("unobtrusiveValidation");
        $.validator.unobtrusive.parse(this);
        return this;
    };
}(jQuery));

这可以这样使用:

$("#SomeForm").initValidation();

如果你有一个表单,你可以添加一个类名,如下所示:

<form id="my-form">
  <input class="js-input" type="text" name="samplename" />
  <input class="js-input" type="text" name="samplename" />
  <input class="submit" type="submit" value="Submit" />
</form>

然后,您可以使用验证器的addClassRules方法来添加这样的规则,这将应用于所有动态添加的输入:

$(document).ready(function() {
  $.validator.addClassRules('js-input', {
    required: true,
  });
  //validate the form
  $('#my-form').validate();
});
$('#form-btn').click(function () {
//set global rules & messages array to use in validator
   var rules = {};
   var messages = {};
//get input, select, textarea of form
   $('#formId').find('input, select, textarea').each(function () {
      var name = $(this).attr('name');
      rules[name] = {};
      messages[name] = {};
      rules[name] = {required: true}; // set required true against every name
//apply more rules, you can also apply custom rules & messages
      if (name === "email") {
         rules[name].email = true;
         //messages[name].email = "Please provide valid email";
      }
      else if(name==='url'){
        rules[name].required = false; // url filed is not required
//add other rules & messages
      }
   });
//submit form and use above created global rules & messages array
   $('#formId').submit(function (e) {
            e.preventDefault();
        }).validate({
            rules: rules,
            messages: messages,
            submitHandler: function (form) {
            console.log("validation success");
            }
        });
});

尝试使用输入数组:

<form action="try.php" method="post">
    <div id="events_wrapper">
        <div id="sub_events">
            <input type="text" name="firstname[]" />                                       
        </div>
    </div>
    <input type="button" id="add_another_event" name="add_another_event" value="Add Another" />
    <input type="submit" name="submit" value="submit" />
</form>

并添加此脚本和jQuery,使用foreach()检索$_POST'ed:的数据

<script>                                                                                    
    $(document).ready(function(){
        $("#add_another_event").click(function(){
        var $address = $('#sub_events');
        var num = $('.clonedAddress').length; // there are 5 children inside each address so the prevCloned address * 5 + original
        var newNum = num + 1;
        var newElem = $address.clone().attr('id', 'address' + newNum).addClass('clonedAddress');
        //set all div id's and the input id's
        newElem.children('div').each (function (i) {
            this.id = 'input' + (newNum*5 + i);
        });
        newElem.find('input').each (function () {
            this.id = this.id + newNum;
            this.name = this.name + newNum;
        });
        if (num > 0) {
            $('.clonedAddress:last').after(newElem);
        } else {
            $address.after(newElem);
        }
        $('#btnDel').removeAttr('disabled');
        });
        $("#remove").click(function(){
        });
    });
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery-validation@1.17.0/dist/jquery.validate.js"></script>
<script>
    $(document).ready(function(){
        $("#commentForm").validate();
    });
    function addInput() {
        var indexVal = $("#index").val();
        var index = parseInt(indexVal) + 1
        var obj = '<input id="list'+index+'" name=list['+index+']  class="required" />'
        $("#parent").append(obj);
        $("#list"+index).rules("add", "required");
        $("#index").val(index)
    }
</script>
<form id="commentForm" method="get" action="">
    <input type="hidden" name="index" name="list[1]" id="index" value="1">
    <p id="parent">
        <input id="list1"  class="required" />
    </p>
    <input class="submit" type="submit" value="Submit"/>
    <input type="button" value="add" onClick="addInput()" />
</form>