【问题标题】:Dynamically add set of inputs to html form将一组输入动态添加到 html 表单
【发布时间】:2023-04-07 14:25:02
【问题描述】:

我目前正在创建一个 HTML 表单,我有一个包含 8 个文本输入的部分。这是到目前为止的部分:

<div class="form-title"><h3>Clinical Information</h3></div>
    <div class="form-title">Time Assesed:</div>
    <input class="form-field" type="time" name="timeassessd" /><br />
    <div class="form-title">Blood Pressure:</div>
    <input class="form-field" type="text" name="bp" /><br />
    <div class="form-title">Pulse:</div>
    <input class="form-field" type="date" name="pulse" /><br />
    <div class="form-title">Resp. Rate:</div>
    <input class="form-field" type="text" name="breathing" /><br />
    <div class="form-title">Temp:</div>
    <input class="form-field" type="text" name="temp" /><br />
    <div class="form-title">SPO2:</div>
    <input class="form-field" type="text" name="spo2" /><br />
    <div class="form-title">GCS:</div>
    <input class="form-field" type="text" name="gcs" /><br />
    <div class="form-title">AVPU:</div>
    <input class="form-field" type="text" name="avpu" /><br />

我需要的是有一个按钮,当用户按下按钮时,它将创建另一个与上面添加字段到表单的部分相同的部分。每个表格的名称末尾还需要一个数字。我环顾了不同的论坛,但我找不到一个完整的部分来添加单独的输入,这对我没有帮助。谢谢。

【问题讨论】:

  • 你的 jquery 工作在哪里?

标签: javascript jquery html forms dynamic


【解决方案1】:

你需要创建一个 JS 函数来添加该部分。该函数看起来像这样:

function add_section() {
        new_row = "";
        new_row += "";
        new_row += '<div class="form-title"><h3>Clinical Information</h3></div>';
        new_row += '<div class="form-title">Time Assesed:</div>';
        new_row += '<input class="form-field" type="time" name="timeassessd" /><br />';
        new_row += '<div class="form-title">Blood Pressure:</div>';
        new_row += '<input class="form-field" type="text" name="bp" /><br />';
        new_row += '<div class="form-title">Pulse:</div>';
        new_row += '<input class="form-field" type="date" name="pulse" /><br />';
        new_row += '<div class="form-title">Resp. Rate:</div>';
        new_row += '<input class="form-field" type="text" name="breathing" /><br />';
        new_row += '<div class="form-title">Temp:</div>';
        new_row += '<input class="form-field" type="text" name="temp" /><br />';
        new_row += '<div class="form-title">SPO2:</div>';
        new_row += '<input class="form-field" type="text" name="spo2" /><br />';
        new_row += '<div class="form-title">GCS:</div>';
        new_row += '<input class="form-field" type="text" name="gcs" /><br />';
        new_row += '<div class="form-title">AVPU:</div>';
        new_row += '<input class="form-field" type="text" name="avpu" /><br />';

        var pos = $("selecter"); //element selecter after which you need to add the section
        $(pos).after(new_row);
}

然后点击按钮,调用这个函数。它会起作用的。

输入字段的名称也应该是一个数组,例如:name="avpu[]" 如果不使用数组,post 方法只会获取最后一个同名输入元素的值。

【讨论】:

    【解决方案2】:

    你能张贴整个表格吗?

    如果您使用 jQuery,您可以做的是克隆表单的 jQuery 节点,然后操作输入名称,然后将内容附加到表单中。
    类似的东西:

    var num = 1;
    function add_form_elements(num) {
       var clonedForm = $('#id_of_the_form').clone();
       clonedForm.find('input').each(function(id, elm) {
         elm.attr("name",elm.attr("name") + num);
       });
       $('#id_of_the_form').append(clonedForm.innerHTML);
       num++;
    });
    

    您需要在按钮上添加一个 EventListener 并将 add_form_elements 函数绑定到它。

    【讨论】:

      【解决方案3】:

      制作新的 div,你想要复制的所有内容都是不可见的。

      <div class="copyable" style="display: none;">
        <div class="form-title"><h3>Clinical Information</h3></div>
        <div class="form-title">Time Assesed:</div>
        <input class="form-field" type="time" name="timeassessd" /><br />
        <div class="form-title">Blood Pressure:</div>
        <input class="form-field" type="text" name="bp" /><br />
        <div class="form-title">Pulse:</div>
        <input class="form-field" type="date" name="pulse" /><br />
        <div class="form-title">Resp. Rate:</div>
        <input class="form-field" type="text" name="breathing" /><br />
        <div class="form-title">Temp:</div>
        <input class="form-field" type="text" name="temp" /><br />
        <div class="form-title">SPO2:</div>
        <input class="form-field" type="text" name="spo2" /><br />
        <div class="form-title">GCS:</div>
        <input class="form-field" type="text" name="gcs" /><br />
        <div class="form-title">AVPU:</div>
        <input class="form-field" type="text" name="avpu" /><br />
      </div>
      

      在JS文件中:

      function add_elm(){
        var content = $('.copyable').html(),
            $elm = $('.elm'); //element where you want to add copyable content
        $elm.append(content);
      }
      

      注意:append 用于在父节点内追加 html。如果你想在其他榆树之后添加html,只需在上面代码的末尾使用after(content)

      【讨论】:

        【解决方案4】:

        以下是使用纯 JavaScript 解决问题的一种方法(请记住,这确实需要更改您的 HTML,因为包含您希望复制的 &lt;input&gt; 元素的部分需要一个类名(此处它是"clinicalInformation",但可以根据您自己的要求进行调整 - 记住更改&lt;button&gt; 元素的data-duplicates 属性中保存的选择器):

        // the event is passed automagically from the addEventListener()
        // method:
        function duplicate(event) {
          // preventing the clicked-element's default behaviour
          // (which in many cases could cause a page reload):
          event.preventDefault();
        
          // using Array.prototype.slice, with Function.prototype.call,
          // on the NodeList returned by document.querySelectorAll(),
          // to create an array of element nodes;
          // 'this.dataset.duplicates' retrieves the attribute-value from
          // the 'data-duplicates' attribute of the clicked element:
          var allCurrent = Array.prototype.slice.call(document.querySelectorAll(this.dataset.duplicates), 0),
            // getting the last element from the array of nodes:
            toClone = allCurrent[allCurrent.length - 1],
        
            // cloning that node, including its child elements:
            clone = toClone.cloneNode(true),
        
            // creating a RegExp (regular expression) literal,
            // to match a sequence of one, or more, numbers (\d+)
            // followed by the end of the string ($):
            reg = /\d+$/,
        
            // creating an 'empty'/unitialised variable for use
            // within the (later) loop:
            childElems;
        
          // adding the created clone to the allCurrent array:
          allCurrent.push(clone);
        
          // using Array.prototype.forEach() to iterate over the
          // array, the arguments (names are user-defined):
          // - first (here 'fieldset') is the current array element
          //   over which we're iterating,
          // - second (here 'index') is the index of the current
          //   array element in the array:
          allCurrent.forEach(function(fieldset, index) {
        
            // finding all descendant elements contained within
            // the current array-element that have a 'name' attribute,
            // using a CSS attribute-selector within
            // document.querySelectorAll():
            childElems = fieldset.querySelectorAll('[name]');
        
            // iterating over those descendant elements in the
            // array-like NodeList:
            Array.prototype.forEach.call(childElems, function(elem) {
        
              // if the regular expression matches the name (
              // RegExp.prototype.test() returning a Boolean true/false
              // based on the string matching, or not matching, the
              // regular expression) we replace that match with the index
              // (from the outer loop), or if not we simply append the
              // index to the current name property-value:
              elem.name = reg.test(elem.name) ? elem.name.replace(reg, index) : elem.name + index;
            });
        
            // navigating from the cloned node to its parent and, using
            // Node.insertBefore(), we insert the created clone before
            // the nextSibling of that cloned node:
            toClone.parentNode.insertBefore(clone, toClone.nextSibling);
          });
        
        }
        
        // getting a reference to the element that should trigger
        // the duplication:
        var addMore = document.getElementById('duplicate');
        
        // adding an event-handler for the 'click' event
        // (note the lack of parentheses):
        addMore.addEventListener('click', duplicate)
        

        function duplicate(event) {
          event.preventDefault();
          var allCurrent = Array.prototype.slice.call(document.querySelectorAll(this.dataset.duplicates), 0),
            toClone = allCurrent[allCurrent.length - 1],
            clone = toClone.cloneNode(true),
            reg = /\d+$/,
            childElems;
        
          allCurrent.push(clone);
          
          allCurrent.forEach(function(fieldset, index) {
            childElems = fieldset.querySelectorAll('[name]');
            Array.prototype.forEach.call(childElems, function(elem) {
              elem.name = reg.test(elem.name) ? elem.name.replace(reg, index) : elem.name + index;
            });
            toClone.parentNode.insertBefore(clone, toClone.nextSibling);
          });
        
        }
        
        var addMore = document.getElementById('duplicate');
        
        addMore.addEventListener('click', duplicate)
        label {
          display: block;
        }
        <!-- here we're using an actual <form> element -->
        <form action="#" method="post">
          <!-- using a fieldset to group the related fields together -->
          <fieldset class="clinicalInformation">
            <!-- the <legend> element semantically titles that group
                 of related fields -->
            <legend class="form-title">
              Clinical Information
            </legend>
        
            <!-- the <label> semantically associates a text-label
                 with a specific form-element; that form-element
                 (<input />, <textarea>, <select>) can appear within
                 the <label>, or the <label> can have a 'for' attribute
                 equal to the 'id' of the associated element. -->
            <label class="form-title">Time Assesed:
              <input class="form-field" type="time" name="timeassessd" />
            </label>
            <label class="form-title">Blood Pressure:
              <input class="form-field" type="text" name="bp" />
            </label>
            <label class="form-title">Pulse:
              <input class="form-field" type="date" name="pulse" />
            </label>
            <label class="form-title">Resp. Rate:
              <input class="form-field" type="text" name="breathing" />
            </label>
            <label class="form-title">Temp:
              <input class="form-field" type="text" name="temp" />
            </label>
            <label class="form-title">SPO<sub>2</sub>:
              <input class="form-field" type="text" name="spo2" />
            </label>
            <label class="form-title">GCS:
              <input class="form-field" type="text" name="gcs" />
            </label>
            <label class="form-title">AVPU:
              <input class="form-field" type="text" name="avpu" />
            </label>
          </fieldset>
          <fieldset>
            <button id="duplicate" data-duplicates=".clinicalInformation">Add more</button>
          </fieldset>
        </form>

        但是,使用 jQuery,因为您已使用该标签来回答您的问题:

        // binding an anonymous click event-handler, using on():
        $('#duplicate').on('click', function(event) {
          // preventing the default action:
          event.preventDefault();
        
          // finding all elements that match the selector from
          // the clicked-element's 'data-duplicates' attribute:
          var allCurrent = $(this.dataset.duplicates),
        
            // finding the last of those elements:
            toClone = allCurrent.last(),
        
            // creating the clone, including the child elements:
            clone = toClone.clone(true),
        
            // the regular expression (as above):
            reg = /\d+$/;
        
          // adding the clone to the 'allCurrent' collection,
          // then iterating over them with each(), getting a
          // reference to the index of each element in the collection:
          allCurrent.add(clone).each(function(index) {
        
            // finding all descendant elements that have a name attribute,
            // updating the 'name' property of each of those found
            // elements using prop():
            $(this).find('[name]').prop('name', function(i, n) {
              // the first argument (here: 'i') is the index of the
              // current element in the collection,
              // the second (here: 'n') is the current value of the
              // current element's property.
        
              // exactly the same as above:
              return reg.test(n) ? n.replace(reg, index) : n + index;
            });
          });
        
          // inserting the clone into the document
          // after the toClone element:
          clone.insertAfter(toClone);
        });
        

        $('#duplicate').on('click', function(event) {
          event.preventDefault();
        
          var allCurrent = $(this.dataset.duplicates),
            toClone = allCurrent.last(),
            clone = toClone.clone(true),
            reg = /\d+$/;
        
          allCurrent.add(clone).each(function(index) {
            $(this).find('[name]').prop('name', function(i, n) {
              return reg.test(n) ? n.replace(reg, index) : n + index;
            });
          });
        
          clone.insertAfter(toClone);
        });
        label {
          display: block;
        }
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <form action="#" method="post">
          <fieldset class="clinicalInformation">
            <legend class="form-title">
              Clinical Information
            </legend>
        
            <label class="form-title">Time Assesed:
              <input class="form-field" type="time" name="timeassessd" />
            </label>
            <label class="form-title">Blood Pressure:
              <input class="form-field" type="text" name="bp" />
            </label>
            <label class="form-title">Pulse:
              <input class="form-field" type="date" name="pulse" />
            </label>
            <label class="form-title">Resp. Rate:
              <input class="form-field" type="text" name="breathing" />
            </label>
            <label class="form-title">Temp:
              <input class="form-field" type="text" name="temp" />
            </label>
            <label class="form-title">SPO<sub>2</sub>:
              <input class="form-field" type="text" name="spo2" />
            </label>
            <label class="form-title">GCS:
              <input class="form-field" type="text" name="gcs" />
            </label>
            <label class="form-title">AVPU:
              <input class="form-field" type="text" name="avpu" />
            </label>
          </fieldset>
          <fieldset>
            <button id="duplicate" data-duplicates=".clinicalInformation">Add more</button>
          </fieldset>
        </form>

        参考资料:

        【讨论】:

          猜你喜欢
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          • 2012-07-13
          • 2011-01-04
          • 1970-01-01
          • 1970-01-01
          • 2020-09-08
          • 2011-07-20
          相关资源
          最近更新 更多