克隆 JQuery 后添加额外的输入文本

Posted

技术标签:

【中文标题】克隆 JQuery 后添加额外的输入文本【英文标题】:Adding additional input text after cloning JQuery 【发布时间】:2021-06-25 22:34:56 【问题描述】:

我对 javascript/jQuery 比较陌生,我正在尝试克隆一个表单来记录分数。我可以在预克隆表单中添加任意数量的输入,但我无法在后续克隆表单中添加或删除任何其他文本输入。

假设在我添加一个先决条件之前,我放入了 5 个输入框。在第一种形式中,我可以根据需要删除和添加任意数量的输入框。

现在假设我添加了一个先决条件,它将克隆第一个表单,但在克隆的表单中,我无法添加或删除任何输入框。那是我的问题。

在这一点上,我很难解决如何解决这个问题。

$(document).ready(function() 
  var max_fields = 10;
  var wrapper = $(".form-input");
  var add_button = $(".add_item");

  var x = 1;
  $(add_button).click(function(e) 
    e.preventDefault();
    if (x < max_fields)  //max input box allowed
      x++; //text box increment
      $(wrapper).append('<div><input type="text" name="items[]"/><a href="#" class="remove_field">X</a></div>'); //add input box
    
  );

  $(wrapper).on("click", ".remove_field", function(e)  //user click on remove text
    e.preventDefault();
    $(this).parent('div').remove();
    x--;
  )
);

//Write code to clone form here, but set everything to default and add
//a button to remove any prerequisites.

$(document).ready(function() 
  var ctr = 1;
  $(".add_req").click(function() 
    $(".myForm").eq(0)
      .clone()
      .find("input")
      .val("")
      .end()
      .show()
      .insertAfter(".myForm:last");
  );
  $('.all').on('click', ".remove-req", function() 
    $(this).closest('.myForm').remove();
  );
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<head>
  <meta charset=utf-8 />
  <title>JS Bin</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div class="all">
    <button class="add_req">Add Preq-Requisite</button>
    <form class="myForm">
      <section class="selection-menus">

        <select name="major" class="major">
          <option selected="selected">SELECT MAJOR</option>
          <option value="CS">Computer Science</option>
          <option value="CIS">Computer Information Systems</option>
        </select>

        <select name="course-no" class="course-no">
          <option value="CS_000">SELECT COURSE</option>
          <option value="CS_140">140</option>
          <option value="CS_210">210</option>
          <option value="CS_220">220</option>

          <!--THERE IS NO CIS DATA, THIS IS JUST FOR FUNCTIONALITY-->
          <option value="CIS_000">SELECT COURSE</option>
          <option value="CIS_315">315</option>
          <option value="CIS_330">330</option>
          <option value="CIS_497">497</option>
        </select>

        <button class="add_item">Add Item</button>

      </section>

      <div class="form-input">
        <div><input type="text" name="items[]"></div>
      </div>
      <span class="remove-req">Remove Req</span>
    </form>
  </div>
</body>

【问题讨论】:

我对这个问题感到困惑。这更像是一个恳求我提出更多问题的声明。就像 “现在假设我添加了一个先决条件,它将克隆第一个表单,但是在克隆的表单中我无法添加或删除任何输入框。这是我的问题。” 是什么意思? @StackSlave 简而言之:动态添加的&lt;span&gt; 元素不会触发点击事件监听器。 【参考方案1】:

这与您选择wrapper 元素的方式有关。

当页面加载时,您将获得带有$(".form-input");wrapper 元素。这意味着您现在已经选择了页面上当前具有.form-input 类的元素。这很好用。

但是,您从这里克隆您的表单并使用来自原始表单的.form-input 创建第二个元素。但这里的区别在于wrapper 变量从未找到第二个.form-input,因为它还不存在。对于所有后续的.form-input 元素,同样适用。

解决此问题的方法是更改​​ .remove_field 的事件侦听器。不要只收听第一个wrapper,而是收听document 上的click。所有点击最终都会冒泡到文档中,除非它们被拦截并停止。

$(document).ready(function() 
  var max_fields = 10;
  var wrapper = $(".form-input");
  var add_button = $(".add_item");

  var x = 1;
  $(document).on('click', '.add_item', function(e) 
    e.preventDefault();
    var $this = $(this);
    var $formInput = $this.parent().next();
    
    if (x < max_fields)  //max input box allowed
      x++; //text box increment
      $formInput.append('<div><input type="text" name="items[]"/><a href="#" class="remove_field">X</a></div>'); //add input box
    
  );

  $(document).on("click", ".remove_field", function(e)  //user click on remove text
    e.preventDefault();
    $(this).parent('div').remove();
    x--;
  )
);

//Write code to clone form here, but set everything to default and add
//a button to remove any prerequisites.

$(document).ready(function() 
  var ctr = 1;
  $(".add_req").click(function() 
    $(".myForm").eq(0)
      .clone()
      .find("input")
      .val("")
      .end()
      .show()
      .insertAfter(".myForm:last");
  );
  $('.all').on('click', ".remove-req", function() 
    $(this).closest('.myForm').remove();
  );
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<head>
  <meta charset=utf-8 />
  <title>JS Bin</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div class="all">
    <button class="add_req">Add Preq-Requisite</button>
    <form class="myForm">
      <section class="selection-menus">

        <select name="major" class="major">
          <option selected="selected">SELECT MAJOR</option>
          <option value="CS">Computer Science</option>
          <option value="CIS">Computer Information Systems</option>
        </select>

        <select name="course-no" class="course-no">
          <option value="CS_000">SELECT COURSE</option>
          <option value="CS_140">140</option>
          <option value="CS_210">210</option>
          <option value="CS_220">220</option>

          <!--THERE IS NO CIS DATA, THIS IS JUST FOR FUNCTIONALITY-->
          <option value="CIS_000">SELECT COURSE</option>
          <option value="CIS_315">315</option>
          <option value="CIS_330">330</option>
          <option value="CIS_497">497</option>
        </select>

        <button class="add_item">Add Item</button>

      </section>

      <div class="form-input">
        <div><input type="text" name="items[]"></div>
      </div>
      <span class="remove-req">Remove Req</span>
    </form>
  </div>
</body>

我建议您不要克隆整个 &lt;form&gt; 元素,因为我可以想象所有数据都必须作为一个整体发送。但是每个&lt;form&gt; 元素都是它自己的实体,不会与其他表单一起使用。

【讨论】:

@ikiK,你是对的。它们现在已修复。 @EmielZuurbier 那么您是否建议我将表单的主要内容包装在 div 中并克隆 div 以便它仍然在表单中?像
是的,完全正确。然后 .container 元素将是您要克隆的元素。当您提交所有添加字段的所有值时,将在一个表单中发送。 @EmielZuurbier 酷!非常感谢您的帮助!
【参考方案2】:

你不能使用:

  var wrapper = $(".form-input");
  var add_button = $(".add_item");

当您添加新表单时,这些选择器将不再起作用,并且您添加的添加按钮上没有任何事件。 而是使用:

 $(document).on("click", ".add_item", function(e) 

如果您将文档定位在可以动态添加和定位的内容上。 及以后:

$(e.target).parents(".myForm").find(".form-input")

target 点击目标并搜索要附加到的适当元素。

$(document).ready(function() 
  var max_fields = 10;


  var x = 1;
  $(document).on("click", ".add_item", function(e) 
    e.preventDefault();
    if (x < max_fields)  //max input box allowed
      x++; //text box increment
      $(e.target).parents(".myForm").find(".form-input").append('<div><input type="text" name="items[]"/><a href="#" class="remove_field">X</a></div>'); //add input box
    
  );

  $(".form-input").on("click", ".remove_field", function(e)  //user click on remove text
    e.preventDefault();
    $(this).parent('div').remove();
    x--;
  )
);

//Write code to clone form here, but set everything to default and add
//a button to remove any prerequisites.

$(document).ready(function() 
  var ctr = 1;
  $(".add_req").click(function() 
    $(".myForm").eq(0)
      .clone()
      .find("input")
      .val("")
      .end()
      .show()
      .insertAfter(".myForm:last");
  );
  $('.all').on('click', ".remove-req", function() 
    $(this).closest('.myForm').remove();
  );
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<head>
  <meta charset=utf-8 />
  <title>JS Bin</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div class="all">
    <button class="add_req">Add Preq-Requisite</button>
    <form class="myForm">
      <section class="selection-menus">

        <select name="major" class="major">
          <option selected="selected">SELECT MAJOR</option>
          <option value="CS">Computer Science</option>
          <option value="CIS">Computer Information Systems</option>
        </select>

        <select name="course-no" class="course-no">
          <option value="CS_000">SELECT COURSE</option>
          <option value="CS_140">140</option>
          <option value="CS_210">210</option>
          <option value="CS_220">220</option>

          <!--THERE IS NO CIS DATA, THIS IS JUST FOR FUNCTIONALITY-->
          <option value="CIS_000">SELECT COURSE</option>
          <option value="CIS_315">315</option>
          <option value="CIS_330">330</option>
          <option value="CIS_497">497</option>
        </select>

        <button class="add_item">Add Item</button>

      </section>

      <div class="form-input">
        <div><input type="text" name="items[]"></div>
      </div>
      <span class="remove-req">Remove Req</span>
    </form>
  </div>
</body>

【讨论】:

以上是关于克隆 JQuery 后添加额外的输入文本的主要内容,如果未能解决你的问题,请参考以下文章

为递归添加的字段访问 jquery 类名

asp.net jquery 用文本框添加行(克隆行)并动态下拉

jQuery克隆后Chrome错误地使表单输入无效

在 jQuery 中克隆或向表单添加输入不会提交到 Firefox 中的 PHP

Jquery浅克隆与深克隆

jQuery droppable div不接受克隆