简体   繁体   English

在 Javascript 中创建具有动态名称的表单元素?

[英]Create form elements with dynamic names in Javascript?

Inside my form, I have a div like this在我的表单中,我有一个这样的 div

<div>
  <button type="button" class="btn btn-seconday" onclick="addCourse()">Add Course</button>
  <div id="course_add" class="container">
    <div class="form-group">
      <label for="course name">Course Name</label>
      <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[0][course_name]"/>
    </div>
    <div class="form-group">
      <label for="no_of_students">Number of Students</label>
      <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[0][no_of_students]"/>
    </div>
  </div>
</div>

When the button is clicked, I want it to create the input fields again inside the div container.单击按钮时,我希望它在 div 容器内再次创建输入字段。 But with dynamic name.但具有动态名称。 like If the button is created first time then It should be比如如果按钮是第一次创建的,那么它应该是

    <div class="form-group">
      <label for="course name">Course Name</label>
      <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[1][course_name]"/>
    </div>
    <div class="form-group">
      <label for="no_of_students">Number of Students</label>
      <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[1][no_of_students]"/>
    </div>

I need我需要

courses[1][course_name] & courses[1][no_of_students]课程[1][course_name] & 课程[1][no_of_students]

these names to be incremented whenever new input is created.每当创建新输入时,这些名称就会递增。

I am not sure what to do in the addCourse() function.我不确定在 addCourse() function 中要做什么。

function addCourse() {
        i = 1;
        var mydiv = document.getElementById("course_add");
        console.log(mydiv);
    }

You can try this approach你可以试试这个方法

 let index = 0; function addCourse() { const courseHtml = generateCourse(index++); var mydiv = document.getElementById("course_add"); mydiv.insertAdjacentHTML('beforeend', courseHtml); } function generateCourse(indexValue) { return `<div class="form-group"> <label for="course name">Course Name</label> <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[${indexValue}][course_name]"/> </div> <div class="form-group"> <label for="no_of_students">Number of Students</label> <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[${indexValue}][no_of_students]"/> </div>` } //add the first course instead of using HTML directly addCourse()
 <div> <button type="button" class="btn btn-seconday" onclick="addCourse()">Add Course</button> <div id="course_add" class="container"> </div> </div>

First of all, notice that you are using getElementById and in the html you are setting the name attribute.首先,请注意您正在使用 getElementById 并且在 html 中您正在设置名称属性。 to do what you are willing, you need to use createElement and appending the elements.做你想做的事,你需要使用 createElement 并附加元素。

let index = 0;
const containerDiv = document.getElementById('course_add');
function addCourse(){
    const formGroupDiv = document.createElement('div')
    formGroupDiv.setAttribute('class','form-group');
    const input = document.createElement('input');
    input.setAttribute('id',`courses[${index}][course_name]`);
    formGroupDiv.appendChild(input);
    containerDiv.appendChild(formGroupDiv);
    index++;
}

You can simply try this one:你可以简单地试试这个:

 let i = 1; function addCourse() { var mydiv = document.getElementById("course_add"); mydiv.innerHTML += `<div class="form-group"> <label for="course name">Course Name</label> <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[${i}][course_name]" /> </div> <div class="form-group"> <label for="no_of_students">Number of Students</label> <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[${i}][no_of_students]" /> </div>`; i++; }
 <div> <button type="button" class="btn btn-seconday" onclick="addCourse()">Add Course</button> <div id="course_add" class="container"> <div class="form-group"> <label for="course name">Course Name</label> <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[0][course_name]" /> </div> <div class="form-group"> <label for="no_of_students">Number of Students</label> <input type="text" class="block rounded py-1 ml-4 text-sm" name="courses[0][no_of_students]" /> </div> </div> </div>

You should try assigning ids to the inputs rather than the div.您应该尝试将 id 分配给输入而不是 div。

<input id="course_name" type="text" class="block rounded py-1 ml-4 text-sm" name="courses[0][course_name]"/>

Then in your onClick function, change the name property for the input like so然后在您的 onClick function 中,像这样更改输入的名称属性

function addCourse() {
        let i = 1;
        var courseName = document.getElementById("course_name"); 
        courseName.setAttribute("name", "courses["+i+"][course_name]");
    }

Also, the i counter will not update on second click, I suggest you add another property to the input indicating counter and increment it on click.此外, i计数器不会在第二次单击时更新,我建议您在输入中添加另一个属性来指示计数器并在单击时增加它。

<input id="course_name" counter="1" type="text" class="block rounded py-1 ml-4 text-sm" name="courses[0][course_name]"/>

 function addCourse() {
            var courseName = document.getElementById("course_name");
            let i = courseName.attributes[0].name; 
            courseName.setAttribute("name", "courses["+i+"][course_name]");
            courseName.setAttribute("counter", (parseInt(i)+1).toString());
        }

Do the same for Number of Students input.Number of Students输入执行相同的操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM