innerHTML 不会永久添加 HTML 元素

Posted

技术标签:

【中文标题】innerHTML 不会永久添加 HTML 元素【英文标题】:innerHTML doesn't add HTML elements permanently 【发布时间】:2016-07-07 01:13:59 【问题描述】:

我试图了解下面代码中innerhtml 的行为。每次点击按钮时,我都想永久添加一个新的div 块,但似乎新块只弹出一瞬间然后消失。

有谁知道为什么会这样,以及如何解决?

另外,当我将代码更改为使用appendChild 而不是innerHTML 时,我收到一条错误消息Argument 1 of Node.appendChild is not an object.。我不确定这意味着什么。

非常感谢任何帮助!

下面是代码:

<DOCTYPE html>
<html>
    <body>
        <form onSubmit="loadData()">
            <input type="submit" id="button">
        </form>

        <div id="block">List of items:</div>

        <script>
            function loadData()
                document.getElementById("block").innerHTML += "<div>item</div>";
            //  document.getElementById("block").appendChild("<div>item</div>");

            ;

        </script>
    </body>
</html>

【问题讨论】:

您正在使用导致重新加载的提交按钮。使用普通按钮就不会出现这个问题。 所以我用这个&lt;button id="button"&gt;Submit&lt;/button&gt;替换了输入标签。当我按下按钮时似乎什么都没有发生 那是因为您的代码只添加了“onSubmit”项。查看我的解决方案和 cmets... 啊,好吧,那部分就解决了。您是否碰巧知道为什么 appendChild 在这种情况下不起作用?谢谢! 【参考方案1】:

因为您正在提交,所以页面重新加载并且您的 HTML 被删除。

如果您需要持久化项目,那么您将需要使用 cookie、localStorage 或服务器端解决方案。

function addItem() 

  document.getElementById("block").innerHTML += "<div>item</div>";
<DOCTYPE html>
  <html>

  <body>
    <form>
      <input type="button" id="button" onclick="addItem()" />
    </form>

    <div id="block">List of items:</div>


  </body>

  </html>

【讨论】:

【参考方案2】:

您正在提交页面。 appendChild 或 innerHtml 在提交后直接发生,在新页面加载之前。加载新页面后,当前页面(具有应用的修改)将被关闭并替换为新页面。

如果您希望在新页面上发生某些事情,则需要在该页面上执行代码。 (或者不使用表单提交,而是使用一些 ajax 来发送表单)。

appendChild 不适合你的原因是 appendChild 需要一个 dom 节点作为参数,而不是字符串。就像document.getElementById("foo).appendChild(document.createElement("div"))。 (棘手的部分是使用 createElement 你得到一个空元素,你还需要将你想要的内容放入其中。

【讨论】:

谢谢马蒂亚斯!我想尝试使用 ajax 发送表单,因为这对我来说是新事物。你介意给我一个示例代码,展示如何在我上面的案例中采用 ajax 吗?【参考方案3】:

@lee 已经回答了您的第一个问题。 您对第二个答案的问题是,您不能像以前那样使用 appendChild。如果你想使用 append child,根据mozilla developer docs 你将不得不这样:

var mydiv = document.createElement("div");
mydiv.appendChild(document.createTextNode("item"));
document.getElementById("block").appendChild(mydiv);

得到你要求的结果。

【讨论】:

感谢 suits_at!假设,我想向新创建的 div 添加一些属性,而不是仅仅添加文本“item”,例如类,高度,宽度属性,我该怎么做? 同样可以创建属性节点。为了更轻松地处理代码,我刚刚为您制作了一个简短的代码笔。 codepen.io/suits_at/pen/WwppMy

以上是关于innerHTML 不会永久添加 HTML 元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 innerHtml 添加的元素不受 Javascript 库影响

JavaScript中,可以用元素的innerHTML直接添加子元素吗?

在JavaScript中的元素之前添加innerHTML? [复制]

在 IE 中使用 .innerHTML 添加选项元素

innerHTML 不适用于 IE 中的 <datalist> HTML5 元素

JavaScript 从入门到放弃事件委托和使用innerHTML添加元素