【问题标题】:Appending Child resets previous appended element value on JavaScript附加子项在 JavaScript 上重置先前附加的元素值
【发布时间】:2021-06-05 03:43:03
【问题描述】:

情况如下:我有一个带有一些输入文本框的表单和一个在单击时调用add() 函数的按钮。这是 HTML 代码:

<div id="resultdiv" style="display: none" align="center">
    <TEXTAREA id="resultcode" style="width: 100%; height: 70%"></TEXTAREA>
</div>
<div align="center" width="100%">
    <form>
        <input type="text" name="atrib" value="atrib name"><input type="text" name="val" value="default value"><br>
        <div id="bar"></div>
        <input type="button" value="Add" onclick="add();"><input type="button" value="Generate" onclick="gen();">
    </form>
</div>

add() 函数将两个新的输入表单添加到 id 为 bar 的 de div 中。这工作没有任何麻烦,问题是如果我添加一个新文本框并写入一些与默认值不同的值,一旦我再次单击“添加”按钮,就会创建一个新文本框,但前一个文本框的值创建的文本框再次更改为默认值!!!

这是带有 add() 函数的 JavaScript 代码:

function add() {
    //Create an input type dynamically.
    var element = document.createElement("input");
    var element2 = document.createElement("input");

    //Assign different attributes to the element.
    element.setAttribute("type", "text");
    element.setAttribute("value", "atrib name");
    element.setAttribute("name", "atrib");
    element2.setAttribute("type", "text");
    element2.setAttribute("value", "default value");
    element2.setAttribute("name", "val");

    // the div id, where new fields are to be added
    var bar = document.getElementById("bar");

    //Append the element in page (in span).
    bar.appendChild(element);
    bar.appendChild(element2);
    bar.innerHTML += "<br>";
}

这里是整个应用程序的 jsfiddle:http://jsfiddle.net/3a1kojgn/

如果我在每个 add() 调用中创建全新的元素,我不明白为什么在添加另一个文本框时,之前动态添加的文本框的值会重置。有什么提示吗?

【问题讨论】:

  • 我不能告诉你为什么,但是删除这一行 bar.innerHTML += "&lt;br&gt;"; ,它可以工作
  • 哦,太好了!但是如果我删除该行,我会遇到新输入的格式错误(内联)的问题:(
  • 是的,有格式错误的解决方案 - 请参阅下面的答案

标签: javascript html dom


【解决方案1】:

试试这个

See the working Demo Here

您需要将行 bar.innerHTML += "&lt;br&gt;"; 更改为 bar.appendChild(element3);

function add() {
    //Create an input type dynamically.
    var element = document.createElement("input");
    var element2 = document.createElement("input");
    var element3 = document.createElement("br"); // Create element of <bt/>
    //Assign different attributes to the element.
    element.setAttribute("type", "text");
    element.setAttribute("value", "atrib name");
    element.setAttribute("name", "atrib");
    element2.setAttribute("type", "text");
    element2.setAttribute("value", "default value");
    element2.setAttribute("name", "val");

    // the div id, where new fields are to be added
    var bar = document.getElementById("bar");

    //Append the element in page (in span).
    bar.appendChild(element);
    bar.appendChild(element2);
    bar.appendChild(element3); // add <br/> element
}

JSFIDDLE

更新: - 下面的 DOM 元素属性可能导致浏览器执行 重排操作

  • innerHTML
  • offsetParent
  • style
  • scrollTop

innerHTML 只会在设置更改 DOM 时触发重排。

innerHTML 更改对象的 HTML,这肯定会影响大小和位置,并会触发至少部分回流。

See the reference link

【讨论】:

  • @CornezuelodelCenteno - 查看链接
  • @CornezuelodelCenteno - 很高兴帮助你 :) - upvote 答案 - 它将帮助其他人找到正确的解决方案。
  • 谢谢!这就像一个魅力!顺便说一句,这对我来说并没有任何逻辑为什么它有效,但是将 br 添加到 bar.innerHTML += "&lt;br&gt;"; 会导致这种奇怪的行为:S 如果你或任何人可以解释背后的逻辑或原因,我会很高兴学习:)
  • 可能的解释:通过更改 innerHTML,您会导致浏览器重排/重新显示 HTML 文本,从而导致所有相应的数据结构被重建和重新初始化。
  • 它与回流无关,它与布局有关,但与.innerHTML 将dom节点替换为新节点有关。 += 分解为 element.innerHtml = element.innerHTML + newValue。 IE。它将内容替换为字符串,而不是 DOM 树。这意味着所有 dom 属性,包括文本值都会丢失。
【解决方案2】:

改变这个:

    bar.innerHTML += "<br>";

收件人:

    bar.insertAdjacentHTML('beforeend', "<br>");

文档:https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML

【讨论】:

  • 如果您不想(或不能)创建与appendChild() 一起使用的新元素,这就是您要走的路。
猜你喜欢
  • 2014-01-16
  • 2017-03-20
  • 2011-11-07
  • 2021-11-27
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
相关资源
最近更新 更多