本文深入解析JavaScript中removeChild方法的机制。重点说明节点删除后仍驻留内存可复用,并警示在遍历父节点子节点时,children属性会随删除操作实时更新,直接遍历易引发逻辑错误。通过具体代码示例展示正确删除及遍历过滤子节点的方法,帮助开发者避免常见DOM操作陷阱。
removeChild 方法概述与内存机制
1. 概述
执行删除操作后,该节点虽然不再存在于文档树结构中,但它依然保留在内存中,开发者可以随时将其重新添加到页面的其他位置。
在遍历父节点的子节点并执行删除操作时,必须注意children属性是只读的,且该属性会实时反映子节点的变化。这意味着如果在遍历过程中直接删除子节点,迭代器的索引可能会因列表长度动态缩短而指向错误位置,导致漏删或越界。
// 拿到待删除节点:
var self = document.getElementById('to-be-removed');
// 拿到父节点:
var parent = self.parentElement;
// 删除:
var removed = parent.removeChild(self);
removed === self; // true
代码示例与遍历陷阱
2. example
<!DOCTYPE html>
<html>
<head>
</script>
</head>
<body>
<ul id="test-list">
<li>JavaScript</li>
<li>Swift</li>
<li>HTML</li>
<li>ANSI C</li>
<li>CSS</li>
<li>DirectX</li>
</ul>
<script>
var p= document.getElementById('test-list');
var length = p.children.length;
var i=0;
for(; i<length; ){
var li = p.children[i];
var text = li.innerText;
if(text!=='JavaScript' && text!=='HTML' && text!=='CSS'){
p.removeChild(li);
alert(p.children.toString());
length--;
}else{
i++;
}
}
// 测试:
;(function () {
var
arr, i,
t = document.getElementById('test-list');
if (t && t.children && t.children.length === 3) {
arr = [];
for (i = 0; i < t.children.length; i ++) {
arr.push(t.children[i].innerText);
}
if (arr.toString() === ['JavaScript', 'HTML', 'CSS'].toString()) {
alert('测试通过!');
}
else {
alert('测试失败: ' + arr.toString());
}
}
else {
alert('测试失败!');
}
})();
</script>
</body>
</html>
以上这篇js removeChild 方法深入理解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。