我正在尝试从节点中删除所有子元素,但保留节点的实际文本内容。即从此:
<h3>
MY TEXT
<a href='...'>Link</a>
<a href='...'>Link</a>
<select>
<option>Value</option>
<option>Value</option>
</select>
</h3>
对此:
<h3>
MY TEXT
</h3>
我知道在 jQuery 中有一百万种简单的方法可以做到这一点,但这不是这个项目的选择......我必须使用普通的旧 javascript。
这:
var obj = document.getElementById("myID");
if ( obj.hasChildNodes() ){
while ( obj.childNodes){
obj.removeChild( obj.firstChild );
}
}
显然结果只是<h3></h3>
,当我尝试时:
var h3 = content_block.getElementsByTagName('h3')[0];
var h3_children = h3.getElementsByTagName('*');
for(var i=0;i<h3_children.length;i++){
h3_children[i].parentNode.removeChild(h3_children[i]);
}
它在中途挂断。我认为删除选项有问题,但是改变for
循环以跳过删除,除非h3_children[i].parentNode==h3
(即仅删除第一级子元素)在删除第一个<a>
元素后停止。
我确定我在这里遗漏了一些非常明显的东西,但也许是时候转向人群了。如何删除所有子元素但不保留第一级textNodes
?为什么上述方法不起作用?
编辑
发布了几个可行的解决方案,这很棒,但我仍然对为什么循环和删除h3.getElementsByTagName('*')
不起作用感到有些困惑。类似的方法(改编自Blender)同样不能完成删除子节点的过程。关于为什么会这样的任何想法?