删除所有子节点,但将节点的文本内容保留在javascript中(无框架)

删除所有子节点,但将节点的文本内容保留在javascript中(无框架),javascript,dom,nodes,removechild,Javascript,Dom,Nodes,Removechild,我试图从节点中删除所有子元素,但保留节点的实际文本内容。也就是说,从这个角度出发: <h3> MY TEXT <a href='...'>Link</a> <a href='...'>Link</a> <select> <option>Value</option> <option>Value</option> </se

我试图从节点中删除所有子元素,但保留节点的实际文本内容。也就是说,从这个角度出发:

<h3>
   MY TEXT
   <a href='...'>Link</a>
   <a href='...'>Link</a>
   <select>
      <option>Value</option>
      <option>Value</option>
   </select>
</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]);
}
var h3=content_block.getElementsByTagName('h3')[0];
var h3_children=h3.getElementsByTagName('*');
对于(var i=0;i
var h3=content_block.getElementsByTagName(“h3”)[0];

对于(var i=0;i您可以检查每个节点的属性
.nodeType
.nodeName

文本节点的这些属性设置为:

.nodeType == 3
.nodeName == '#text'`
例如:

var e = obj.firstChild
while (e) {
   if (e.nodeType == 3) {
      e = e.nextSibling
   } else {
      var n = e.nextSibling
      obj.removeChild(e)
      e = n
   }
}

试试这个。我想你会在这里保存ant文本

var h3 = document.getElementsByTagName('h3')[0];

if (h3.hasChildNodes()) {
    for (var i = h3.childNodes.length - 1; i >= 0; i--) {
        if (h3.childNodes[i].nodeName != "#text")
            h3.removeChild(h3.childNodes[i]);
    }
}
希望它能起作用。

好吧,我用的东西(灵感来源于这里的答案)有点像:

   var h3 = document.getElementsByTagName("h3")[0];
    Array.protoype.filter.call(h3.childNodes, function(child){
        if (child.nodeType != 3) {
            h3.removeChild(child);
        }
    });

奇怪的是,除了一个
@Blender之外,这删除了所有元素-是的,我在
getElementsByTagName循环中得到了类似的结果(删除了大部分但不是所有的元素)。想知道为什么吗?好家伙!我想我可能需要对
[x]进行检查.nodeType==3
但我没有想到使用
h3.childNodes.length
…我一直在试图找出如何在不创建无限循环的情况下使用
while(obj.childNodes)
。知道为什么
getElementsByTagName()循环
不起作用?@BenD注意我回答中的
i--
?每当你删除一个子节点时,父节点的
childNodes。长度
缩短了1,所以你也必须“后退”迭代器。否则你会在只剩下2个子节点的情况下调用
h3\u children[3]
。如果(lala.nodeType!=3)remove
,甚至更短,没有无意义的continue分支。@某人谢谢!顺便说一句,我喜欢你的解决方案。与passway的答案非常相似,但它确实有效,而且语法稍微短一点
var h3 = document.getElementsByTagName('h3')[0];

if (h3.hasChildNodes()) {
    for (var i = h3.childNodes.length - 1; i >= 0; i--) {
        if (h3.childNodes[i].nodeName != "#text")
            h3.removeChild(h3.childNodes[i]);
    }
}
   var h3 = document.getElementsByTagName("h3")[0];
    Array.protoype.filter.call(h3.childNodes, function(child){
        if (child.nodeType != 3) {
            h3.removeChild(child);
        }
    });