【问题标题】:Can't remove text in DOM that has no element or tag无法删除 DOM 中没有元素或标签的文本
【发布时间】:2020-03-26 23:27:50
【问题描述】:

我现在忙了一段时间,但我无法解决它。我已经检查了此页面上的所有答案,但仍然无法正常工作。文本保留在页面上。

Using .text() to retrieve only text not nested in child tags

我的 HTML:

<div class="parent">
    <div class="child1">
        <div class="child-of-child1">
            A lot of elements here
        </div> -----> (closing child of child 1)
        TEXT I LIKE TO REMOVE
    </div> -----> (closing child 1)
</div>

我尝试过的是该主题中的所有内容。仅供参考,我也试过这个:

document.getElementsByClassName('child-of-child1').childNodes[0].nodeValue = "";

但是不,没有任何效果,文本仍然存在......

注意:我无法进入源代码来实际更改或添加元素或类名到文本中。否则,我不会打扰。

你能帮忙吗?

【问题讨论】:

    标签: javascript jquery html dom


    【解决方案1】:

    您可以轻松过滤直接子级中的文本节点:

    var container = document.querySelector('.child1');
    
    for(var node of container.childNodes) {
      if (node.nodeType === Node.TEXT_NODE) {
        container.removeChild(node);
      }
    }
    <div class="parent">
        <div class="child1">
            THIS WILL DISAPPEAR
            THIS WILL DISAPPEAR
            <div class="child-of-child1">
                A lot of elements here
            </div>
            THIS WILL DISAPPEAR
        </div>
    </div>

    【讨论】:

    • 谢谢,谢谢。这就是诀窍。请问,这也是性能方面的好习惯吗?
    • @Siyah 它将查找child1 的每个直接子节点。如果你没有很多(少于 100 个),我不会担心。但请注意,此解决方案将删除 all 直接子文本节点。如果您只想删除child-of-child1 之后的单个文本节点,@T.J.克劳德的解决方案可能更合适
    • 谢谢,谢谢。感谢您的帮助!
    • 使用for(let node of container.childNodes){ },应该会更快。
    • @StackSlave 正确,并且更易于阅读。更新了答案!谢谢(我使用var,因为我怀疑提问者使用的是 Babel,所以保持它符合 ES5 更安全)
    【解决方案2】:

    var cNodes = document.querySelector('.child1').childNodes;
     if(cNodes.length>0)
     cNodes[cNodes.length-1].nodeValue="";
    <div class="parent">
        <div class="child1">
            <div class="child-of-child1">
                A lot of elements here
            </div>
            TEXT I LIKE TO REMOVE
        </div>
    </div>
    
    Hello

    【讨论】:

    • 这是一个按钮。那不是我提到或问的......
    • 您只是想一看到就删除它?
    • 理想的解决方案是什么样子的......我会试着回答b​​ruh!!。
    • 在性能方面,blex的方案要好一些。我非常感谢您的帮助,您确实是 Supercool! :))
    • @Siyah 关于性能,我敢打赌这个更好,因为它不像我的那样查找每个节点
    【解决方案3】:

    你可以通过它前面的元素来定位它,然后得到它的nextSibling

    const textNode = document.querySelector(".parent .child1 .child-of-child1").nextSibling;
    textNode.parentNode.removeChild(textNode);
    

    现场示例:

    setTimeout(() => {
        const textNode = document.querySelector(".parent .child1 .child-of-child1").nextSibling;
        textNode.parentNode.removeChild(textNode);
    }, 800);
    <div class="parent">
        <div class="child1">
            <div class="child-of-child1">
                A lot of elements here
            </div>
            TEXT I LIKE TO REMOVE
        </div>
    </div>

    【讨论】:

    • 谢谢,但无法正常工作。收到“未捕获的 TypeError:无法读取属性 'parentNode' of null”错误。
    • 它在演示中工作。您是否正在等待 DOM (HTML) 准备就绪?通过将 &lt;script&gt; 放在 HTML 末尾的 &lt;/body&gt; 结束标记之前,或者将 JS 包装在 window.addEventListener('DOMContentLoaded', function() { /* ... */ }); 之类的东西中?
    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多