gpt4 book ai didi

javascript - DOM:裁剪元素并使用 parentNode

转载 作者:行者123 更新时间:2023-11-29 10:18:06 24 4
gpt4 key购买 nike

考虑这个简单的页面:

<html>
<head>
<script>
var upper;
var lower;

function crop() {
//upper = document.getElementById('upper');
lower = document.getElementById('lower');
document.body.innerHTML = '';
document.body.appendChild(lower.cloneNode(true));
}

function up() {
document.body.innerHTML = '';
document.body.appendChild(lower.parentNode);
}
</script>
</head>
<body>
<div id="upper">
Upper Div
<div id="lower">
Lower Div
<button onclick="crop()">Crop</button>
<button onclick="up()">Up</button>
</div>
</div>
</body>
</html>

因此,Crop 按钮会清除主体,克隆下方的 div 并将其附加到主体。 Up 按钮的目的是使下部 div 的父级可见 (upper div)。在我的第一次尝试中,我尝试使用 lower.parentNode,但它不起作用,因为它是 null。我认为这是因为变量 lower 现在指向一个 DOM 元素,它不是正文的一部分。 (我的理解正确吗?)但现在考虑注释行:

//upper = document.getElementById('upper');

除了获取对上层 div 的引用外什么都不做。当我取消注释这一行时,up() 开始工作。奇怪的是我没有以任何方式使用这个变量。你能解释一下这种行为吗?

最佳答案

当您设置 document.body.innerHTML = ''; 时,您要删除 <body> 的所有子节点来自 DOM 树,但不会破坏这些节点本身的树结构。如果不存在对这些节点的引用,它们也会被销毁并被垃圾收集。

您已设置(全局) lower = document.getElementById('lower'); , 所以存在对 <div id="lower"> 的引用,这意味着虽然它可能会从 DOM 树 中删除,但它不会被销毁或被垃圾收集,因为它通过此引用“保持事件状态”。

现在奇怪的事情来了,因为你混合了 String 方法( .innerHTML )和 DOM 方法( getElementById , appendChild ),浏览器不确定从垃圾回收中保存什么。它最终决定 childNodes引用的节点可以保留,但是 parentNode这不是一个足够强大的债券,所以被摧毁。这意味着您不会统一获得 null , 你还可以得到

Uncaught Error: NotFoundError: DOM Exception 8 

当您设置(全局)upper , 这节省了 <div id="upper"> ,因为你现在有一个保持它活着的引用。它还保存了<div id="lower"> , 因为 upperchildNode它也受到保护免受垃圾收集。这保留了 childNode/parentNode它们之间的联系。


还值得注意的是 cloneNode可能会导致 id 属性冲突,因为 id 必须是唯一的,但根据定义,克隆不是唯一的 .

关于javascript - DOM:裁剪元素并使用 parentNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17308243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com