jQuery .remove()不适用于动态表单

时间:2013-09-16 21:21:04

标签: javascript jquery forms live dynamic-forms

我正在创建一个动态表单,允许用户添加/删除文本字段。虽然我可以毫无问题地添加文本字段,但我在删除特定文本字段时遇到了困难。

每当我添加其他文本字段(总共5个)时,尝试删除除第一个之外的任何文本字段(例如删除字段3)。所有这些都消失了,好像页面重新加载一样。它好像我的jQuery代码在"删除字段"被按下了。

<form>
...
  <div id="answers">
    <div class="form-group" id="option1">
      <div class="col-xs-11 col-sm-9 col-md-6"> 
        <input class="form-control" id="answer" placeholder="Answer option">
      </div>
      <div class="col-xs-1 col-sm-1 col-md-1" style="line-height:36px;">
        <a href="" class="remove">Remove Field</span></a>
      </div>
    </div>
  </div>
...
</form>

 <div>
   <a href="" id="add">Add another field</a>
 </div>

的jQuery

    <script>
        $(document).ready(function() {

            $( "#add" ).on( "click", function(event) {
                event.preventDefault();                 
                var options = $('#answers .form-group').length + 1;
                $( "#answers div:first" ).clone()
                    .attr('id', 'option' + options)
                .appendTo( "#answers" );

            });

            $( ".remove" ).on( "click", function(event) {
                event.preventDefault();                 
                $(this).closest(".form-group").remove();
            });


        });
    </script>

3 个答案:

答案 0 :(得分:3)

而不是:

$( ".remove" ).on( "click", function(event) {

试试这个:

$(document).on("click", ".remove", function(event) {

答案 1 :(得分:0)

试试这个:

$( "body" ).on( "click", ".remove", function(event) {
      event.preventDefault();                 
      $(this).closest(".form-group").remove();
});

基本上你可以放置类remove的任何父级(不是动态生成的)而不是body

答案 2 :(得分:0)

有了这个:

$(document).ready(function() {
 $( ".remove" ).on( "click", function(event) {
                event.preventDefault();                 
                $(this).closest(".form-group").remove();
            });
}

您正在加载时将侦听器绑定到页面上“remove”项目上的click事件。

在此时间之后添加的所有其他项目都将没有任何绑定的侦听器。

您应该使用3参数监听器

来使用事件delegation
$(document).ready(function() {
 $( "form" ).on( "click", ".remove" ,function(event) {
                event.preventDefault();                 
                $(this).closest(".form-group").remove();
            });
}

此声明的语义包括在完整表单上绑定事件(在加载时存在),但事件将propagate发送到单击的.remove锚点。

如果您使用的是早于1.7的jquery版本,请使用delegate

javascript中事件的propagation或冒泡允许此行为。