You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS动态创建div时insertBefore报错:参考节点非当前节点子节点

错误产生原因
  • 核心问题出在多余的my_div.insertBefore(newDiv, workspace);这行代码,你本身的需求是在容器已有元素末尾追加新div,前面的my_div.appendChild(newDiv)已经完全实现了这个效果,这行insertBefore逻辑完全冗余。
  • insertBefore的调用规则是父节点.insertBefore(待插入新节点, 参考位置的子节点),要求第二个参数必须是当前父节点的直接子元素。你这里传入的workspace既没有提前声明变量,浏览器自动通过id映射拿到的是id为workspace的容器本身(也就是my_div自己),节点不可能是自身的子元素,自然会抛出对应DOM异常。
  • 额外注意:HTML规范中不存在<h7>标签,标题标签范围是<h1>到<h6>,写<h7>会被浏览器当作普通行内元素解析,不会自带标题的默认样式和语义。
修复方法

直接删除多余的insertBefore调用行即可,同时建议把不合法的<h7>换成标准标签,修正后的完整代码如下:

<body>
...
<div id="workspace" >
<script type="text/javascript">
var my_div = document.getElementById("workspace");
var newDiv = null;
function addElement() {
  newDiv = document.createElement("div");
  // 替换为合法的标题/文本标签,这里用h3举例,可根据需求换成p、h4等
  newDiv.innerHTML = "<h3>Hi there and greetings!</h3>";
  newDiv.style.width = "200px";
  newDiv.style.height = "50px";
  newDiv.style.background = "red";
  // appendChild天然会把新节点插到父容器所有子元素的末尾,符合你的需求
  my_div.appendChild(newDiv);
}
</script>

<a href="#" onclick="addElement()">ADD new greeting</a>
</div>
...
</body>

补充说明:如果后续你需要实现「把新元素插到某个已有元素前面」的需求,再使用insertBefore,注意第二个参数必须是父容器下真实存在的子节点,比如要把新元素插到容器最开头,就写my_div.insertBefore(newDiv, my_div.firstChild)。

内容的提问来源于stack exchange,提问作者Wincij

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:48:15