【问题标题】:How do I append input node to form with JavaScript while keeping existing form data?如何在保留现有表单数据的同时使用 JavaScript 将输入节点附加到表单?
【发布时间】:2021-05-06 03:10:45
【问题描述】:

每次单击下面代码中的button 时,我想在form 中添加另一个input 字段。使用appendChild(),似乎我只能这样做一次。我尝试使用innerHTML 添加该字段,但这会删除已在现有表单字段中输入的内容。在保留已经输入表单的内容的同时,使用 vanilla JavaScript 实现这一目标的最佳方法是什么?提前感谢您的帮助。

let getArticleForm = document.getElementById("articleForm");
let cloneInputNode = document.getElementById("textInput").cloneNode(true);
cloneInputNode.setAttribute("id", "newId");

function addInput() {
  getArticleForm.appendChild(cloneInputNode);
}
<form id ='articleForm'>
  <input id="textInput" type="textarea"></input>
</form>
<button onClick="addInput()">add input</button>

Codepen

【问题讨论】:

    标签: javascript append dom-manipulation


    【解决方案1】:

    在监听器内部克隆它,否则你只创建了一个克隆(当再次附加时,它会从之前的位置删除)。

    let getArticleForm = document.getElementById("articleForm");
    
    function addInput() {
      getArticleForm.appendChild(document.getElementById("textInput").cloneNode(true));
    }
    <form id ='articleForm'>
      <input id="textInput" type="textarea"></input>
    </form>
    <button onClick="addInput()">add input</button>

    但也有一些其他的修复:

    • 克隆的节点都将具有相同的 ID,这是无效的 HTML。虽然您可以为每个输入设置一个新 ID,但动态 ID 无论如何都是一种反模式 - 最好完全不使用 IMO。
    • type="textarea" 作为&lt;input&gt; 的属性没有意义。如果您需要文本区域,请使用 &lt;textarea&gt;。
    • 与其克隆现有输入,不如考虑仅附加一个新输入。

    const getArticleForm = document.getElementById("articleForm");
    
    function addInput() {
      getArticleForm.appendChild(document.createElement('input'));
    }
    <form id ='articleForm'>
      <input id="textInput" type="textarea"></input>
    </form>
    <button onClick="addInput()">add input</button>

    【讨论】:

    • 谢谢,这对我帮助很大。有没有办法在不复制已在原始输入字段中输入的文本的情况下完成此操作?这样即使原始节点已经有文本输入,克隆的节点也没有文本输入。
    • 我不会克隆,而是创建一个全新的&lt;input&gt;,请参阅 sn-p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多