【问题标题】:JavaScript generate new input field on clickJavaScript 在点击时生成新的输入字段
【发布时间】:2016-08-23 14:07:20
【问题描述】:

我正在制作一个用户有不同选项的 HTML 表单。我正在尝试制作一个按钮,该按钮可以无限生成一个新的集合操作输入字段,名称增加,例如: 第一个生成的输入的名称应为 input1。下一个名称为 input2,依此类推。

这是一个视觉示例:https://webmshare.com/ZBvw0

如何做到这一点?

【问题讨论】:

  • 欢迎来到 SO!到目前为止,您尝试过什么?

标签: javascript forms button dynamically-generated


【解决方案1】:

您可以通过动态创建表单元素并将它们附加到 form 元素来解决此问题。

下面是一个简化的例子,只是为了展示主要思想。

这里的要点是:

Document.createElement() - 创建一个指定的 HTML 元素(在此实例中是您的表单元素)。

Node.appendChild() - 将一个节点添加到指定父节点的子节点列表的末尾(在此实例中是您的表单元素)。

(function() {
  var counter = 0;
  var btn = document.getElementById('btn');
  var form = document.getElementById('form');
  var addInput = function() {
    counter++;
    var input = document.createElement("input");
    input.id = 'input-' + counter;
    input.type = 'text';
    input.name = 'name';
    input.placeholder = 'Input number ' + counter;
    form.appendChild(input);
  };
  btn.addEventListener('click', function() {
    addInput();
  }.bind(this));
})();
input{
  display: block;
}
<form id="form" action="">
</form>
<button id="btn" type="button">Click Me!</button>

【讨论】:

  • 我看不到“var 模板”应该做什么?
  • 它仍然不是我想要的。正如我在问题中所说,我需要创建一组输入,而不仅仅是一个。像 Joshua 提供的答案将是完美的,只是它删除了以前的输入数据。
  • @SkinFlipNetwork 在函数 addInput 中,您可以通过简单地使用 document.createElement() 添加任何您想要的元素(在那里您可以创建任何类型的 DOM 元素)
  • 正如你在这里看到的pastebin.com/BDUYG11p 这是每次都需要复制的代码块。如果我要为那里的每个项目创建一个元素,那将是永远的。没有 createElement 的方法是否有效?
  • 嗨。我通过稍微修改代码让它工作了。我没有使用 createElement 进行输入,而是让它创建了一个 div,然后我更改了 innerHTML 以便它复制我需要的确切代码行。这是一个粘贴箱:pastebin.com/ELQj8YTh
【解决方案2】:

您可以使用 jquery 来获取 last 项目的名称。

然后你可以使用javascript string replace方法,将'input'替换为''以获得最后一项的编号。

然后将其加 1。您必须先 parse it as an integer 再将其加 1。

然后使用递增的数字,为您的容器创建一个新的输入字段和append it

【讨论】:

    【解决方案3】:

    试试这个

    HTML

    <div id="demo">
    </div>
    <input type="button" id="add" value="Add input"/>
    

    Javascript

    var num = 1;
    document.getElementById('add').addEventListener("click",addInput);
    
    function addInput(){
    var demo = document.getElementById('demo');
    demo.insertAdjacentHTML('beforeend','<div class="form-holder" style="width: 30%;"><a class="form-label">Billet type</a> <br><select name="ttype'+num+'"><option value="normal">Standard Billet</option><option value="add-on">Tilkøbs Billet</option></select></div><div class="form-holder" style="width: 31%; margin-left: 0.6%;"><a class="form-label">Billet navn</a> <br><input name="tname'+num+'" type="text" placeholder="F.eks. Entré Billet" style="width: 100%;" /></div><div class="form-holder" style="float: right; width: 18%; margin-left: 1%;"><a class="form-label">Antal</a> <br><input name="tquan'+num+'" type="text" placeholder="F.eks. 500" style="width: 100%;" /></div><div class="form-holder" style="float: right; width: 18%;"><a class="form-label">Pris (DKK)</a> <br><input name="tprice'+num+'" type="text" placeholder="F.eks. 100" style="width: 100%;" /></div> <br>');
     num++;
    }
    

    查看jsFiddle example

    【讨论】:

    • 此代码存在问题。添加新的输入元素后,之前输入的所有值都将被销毁。
    • 可以修复吗?因为除此之外,这正是我所需要的
    • @SkinFlipNetwork 使用此代码并非如此,要使其正常工作,您必须检索每个输入的值,将它们存储在某个位置并使用包含 input.value 的 HTML 模板重新填充 innerHTML。但老实说。我看不出为什么你应该这样做,而是我会使用更简单的方法,比如使用document.createElement("input");,这很清楚并且可以正常工作。您有什么特殊要求吗?
    • 是的。我需要一次创建多个输入。这是我每次都需要复制的确切输入集:pastebin.com/BDUYG11p
    • @SkinFlipNetwork 我已经进行了必要的更改,代码不再破坏之前输入的值
    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多