动态添加输入元素以形成表单


89

我已经阅读了许多关于动态添加字段集的博客和文章,但是它们都给出了非常复杂的答案。我所需要的并不那么复杂。

我的HTML代码:

<input type="text" name="member" value="">Number of members: (max. 10)<br />
<a href="#" id="filldetails">Fill Details</a>

因此,用户将在该input字段中输入一个整数值(我正在使用javascript检查验证)。在单击Fill Details链接时,将出现相应数量的输入字段供他输入。我想使用javascript实现。

我不是javascript专业人士。我在想如何input通过链接检索用户在字段中填写的整数并显示相应数量的输入字段。

Answers:


149

您可以使用onclick事件处理程序来获取文本字段的输入值。确保为字段赋予唯一id属性,以便可以通过document.getElementById()以下方式安全地引用该字段:

如果要动态添加元素,则应该在容器中放置它们。例如,一个<div id="container">。通过创建新元素document.createElement(),并使用appendChild()将每个元素附加到容器。您可能对输出有意义的name属性感兴趣(例如name="member"+i<input>对于要以表格形式提交的每个动态生成的s,则可能会感兴趣)。

请注意,您还可以使用创建<br/>元素document.createElement('br')。如果只想输出一些文本,则可以使用document.createTextNode()

另外,如果您想在每次将要填充的容器时都将其清除,则可以将hasChildNodes()removeChild()一起使用。

<html>
<head>
    <script type='text/javascript'>
        function addFields(){
            // Number of inputs to create
            var number = document.getElementById("member").value;
            // Container <div> where dynamic content will be placed
            var container = document.getElementById("container");
            // Clear previous contents of the container
            while (container.hasChildNodes()) {
                container.removeChild(container.lastChild);
            }
            for (i=0;i<number;i++){
                // Append a node with a random text
                container.appendChild(document.createTextNode("Member " + (i+1)));
                // Create an <input> element, set its type and name attributes
                var input = document.createElement("input");
                input.type = "text";
                input.name = "member" + i;
                container.appendChild(input);
                // Append a line break 
                container.appendChild(document.createElement("br"));
            }
        }
    </script>
</head>
<body>
    <input type="text" id="member" name="member" value="">Number of members: (max. 10)<br />
    <a href="#" id="filldetails" onclick="addFields()">Fill Details</a>
    <div id="container"/>
</body>
</html>

请参阅此JSFiddle中的工作示例。


我听了你的建议。但是,当我单击时,浏览器控制台显示此错误:Uncaught TypeError: Cannot call method 'appendChild' of undefined
xan

答案非常有帮助。以及如何将CSS类添加到该字段
Pravinraj Venkatachalam

3
@Pravin Glad有所帮助,请参阅如何将类添加到给定元素?。基本上使用input.className += ' someCSSClass';
XaviLópez17年

1
当我提交表单时,动态生成的新字段不会像原始HTML中的其他字段那样提交。它们以视觉方式显示,我可以检查它们,但不提交。有什么想法为什么会发生吗?
circle1

@ circle1确保动态生成的元素确实具有唯一 name属性。提交表单时,只有具有name属性的表单元素才会传递其值。
哈维·洛佩斯

29

尝试使用以下JQuery代码动态地包含表单,字段和删除/删除行为:

$(document).ready(function() {
    var max_fields = 10;
    var wrapper = $(".container1");
    var add_button = $(".add_form_field");

    var x = 1;
    $(add_button).click(function(e) {
        e.preventDefault();
        if (x < max_fields) {
            x++;
            $(wrapper).append('<div><input type="text" name="mytext[]"/><a href="#" class="delete">Delete</a></div>'); //add input box
        } else {
            alert('You Reached the limits')
        }
    });

    $(wrapper).on("click", ".delete", function(e) {
        e.preventDefault();
        $(this).parent('div').remove();
        x--;
    })
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container1">
    <button class="add_form_field">Add New Field &nbsp; 
      <span style="font-size:16px; font-weight:bold;">+ </span>
    </button>
    <div><input type="text" name="mytext[]"></div>
</div>

在这里参考演示


也许我做错了,但就我而言,在此表单中的任何文本字段中按Enter都将导致“添加新字段”按钮的功能被触发,这可能是不想要的行为……
Maxi Mus

1
<button type="button" ...>问题就解决了。
Maxi Mus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.