如何使用 .appendChild 添加 div 包含纯 JavaScript 中的多个文本输入(无 JQuery)

How to use .appendChild to add div containing multiple text inputs in plain JavaScript (without JQuery)

对于当前的实验,我正在尝试制作动态联系表。目标是让用户只需单击按钮即可添加和删除地址,并指示其类型。

我注意到,在使用 innerHTML 表单时,一旦使用新的添加或删除,已经包含值的表单就会丢失它们的值。这似乎是 innerHTML 的本质(this answer 帮助我理解了问题所在,还向我指出了 appendChild)。

但是我不知道如何添加复杂元素,例如包含多个文本 inputsbutton<div>。有什么方法可以实现与我正在做的相同的事情,或者防止其他形式在不使用 JQuery 的情况下丢失输入值?

我已经尝试为此创建一个 MCVE,在这里,还有一个 JS Fiddle 以节省时间。

工作 JS Fiddle 在这里:JSFiddle

var targetOutput = document.getElementById("myForm");
var addressOutput = document.getElementById("addresses");
var requiredAddress = 1;

addressRemoveButton = `<input type="button" value="Remove" name="address" onclick="removeDiv(this)">`;
addressMolecule = `<div class="content"><label>Type:</label>&#9;&#9;<input type="text" name="address['type'][]"><br>
                <label>Address Line 1:</label><input type="text" name="address['line1'][]"><br>
                <label>Address Line 2:</label><input type="text" name="address['line2'][]"><br>
                <label>City:</label><input type="text" name="address['city'][]"><br>
                <label>State:</label><input type="text" name="address['state'][]"><br>
                <label>Zipcode:</label><input type="text" name="address['zipcode'][]"><br>`

window.onload = function(event) {
  myFun('window');
}

function myFun(a) {
  var i;
  for (i = 0; i < requiredAddress; i++) {
    addAddress(false);

    //alert("Max: " + maxAddress + "Current: " + addressCount);
  }
}

function removeDiv(e) {
  e.parentNode.removeChild(e.previousSibling);
  e.parentNode.removeChild(e);
}

function addAddress(removable = true) {
  addressOutput.innerHTML += addressMolecule;
  if (removable == true) {
    addressOutput.innerHTML += addressRemoveButton;
  }
  addressOutput.innerHTML += `</div>`;
}
<body onload="myFun('body')">
  <form name="myForm" id="myForm">
    <div id="addresses">
      <input type="button" id="addressButton" value="Add More" name="address" onclick="addAddress()">
    </div>
  </form>
</body>

如果要在现有容器不丢失其数据的情况下插入另一个 HTML 字符串,请改用 insertAdjacentHTML

addressOutput.insertAdjacentHTML('beforeend', addressMolecule);

var targetOutput = document.getElementById("myForm");
var addressOutput = document.getElementById("addresses");
var requiredAddress = 1;

addressRemoveButton = `<input type="button" value="Remove" name="address" onclick="removeDiv(this)">`;
addressMolecule = `<div class="content"><label>Type:</label>&#9;&#9;<input type="text" name="address['type'][]"><br>
            <label>Address Line 1:</label><input type="text" name="address['line1'][]"><br>
            <label>Address Line 2:</label><input type="text" name="address['line2'][]"><br>
            <label>City:</label><input type="text" name="address['city'][]"><br>
            <label>State:</label><input type="text" name="address['state'][]"><br>
            <label>Zipcode:</label><input type="text" name="address['zipcode'][]"><br>`

window.onload = function(event) {
  myFun('window');
}

function myFun(a) {
  var i;
  for (i = 0; i < requiredAddress; i++) {
    addAddress(false);

    //alert("Max: " + maxAddress + "Current: " + addressCount);
  }
}

function removeDiv(e) {
  e.parentNode.removeChild(e.previousSibling);
  e.parentNode.removeChild(e);
}

function addAddress(removable = true) {
  addressOutput.insertAdjacentHTML('beforeend', addressMolecule);
  if (removable == true) {
    addressOutput.insertAdjacentHTML('beforeend', addressRemoveButton);
  }
  addressOutput.insertAdjacentHTML('beforeend', `</div>`);
}
<body onload="return myFun('body')">
  <form name="myForm" id="myForm">

    <div id="addresses">

      <input type="button" id="addressButton" value="Add More" name="address" onclick="addAddress()">
    </div>

  </form>
</body>

如您所述,使用 可能更好appendChild。创建一个 div,用所需的 HTML 填充它,并将其附加到容器:

function addAddress(removable = true) {
  const newDiv = document.createElement('div');
  newDiv.className = 'content';
  newDiv.innerHTML = addressMolecule; 
  addressOutput.appendChild(newDiv);
  if (removable) {
    const button = addressOutput.appendChild(document.createElement('button'));
    button.outerHTML = addressRemoveButton;
  }
}

var targetOutput = document.getElementById("myForm");
var addressOutput = document.getElementById("addresses");
var requiredAddress = 1;

addressRemoveButton = `<input type="button" value="Remove" name="address" onclick="removeDiv(this)">`;
addressMolecule = `<label>Type:</label>&#9;&#9;<input type="text" name="address['type'][]"><br>
            <label>Address Line 1:</label><input type="text" name="address['line1'][]"><br>
            <label>Address Line 2:</label><input type="text" name="address['line2'][]"><br>
            <label>City:</label><input type="text" name="address['city'][]"><br>
            <label>State:</label><input type="text" name="address['state'][]"><br>
            <label>Zipcode:</label><input type="text" name="address['zipcode'][]"><br>`

window.onload = function(event) {
  myFun('window');
}

function myFun(a) {
  var i;
  for (i = 0; i < requiredAddress; i++) {
    addAddress(false);

    //alert("Max: " + maxAddress + "Current: " + addressCount);
  }
}

function removeDiv(e) {
  e.parentNode.removeChild(e.previousSibling);
  e.parentNode.removeChild(e);
}

function addAddress(removable = true) {
  const newDiv = document.createElement('div');
  newDiv.className = 'content';
  newDiv.innerHTML = addressMolecule; 
  addressOutput.appendChild(newDiv);
  if (removable) {
    const button = addressOutput.appendChild(document.createElement('button'));
    button.outerHTML = addressRemoveButton;
  }
}
<body onload="return myFun('body')">
  <form name="myForm" id="myForm">

    <div id="addresses">

      <input type="button" id="addressButton" value="Add More" name="address" onclick="addAddress()">
    </div>

  </form>
</body>