如何删除直接包含字符串的元素 - 忽略子元素

如何删除直接包含字符串的元素 - 忽略子元素

问题描述:

我想了解如何使用普通JavaScript在页面上删除包含特定字符串的元素。如何删除直接包含字符串的元素 - 忽略子元素

这里是我到目前为止的代码:

var elements = document.querySelectorAll("body > *"); 
for (var i = 0, len = elements.length; i < len; i++) { 
    var current = elements[i]; 

    if (current.innerHTML.indexOf("Word") !== -1) { 
     current.parentNode.removeChild(current); 
    } 
} 

这是能够去除包含短语“字”的元素。但是,它会深入到divs子节点,并在子节点包含该字符串时返回true。

我该如何改变它,以便它检查元素是否直接包含字符串,并在搜索当前元素时忽略子元素。

该代码仍应搜索每个元素,但不进入子节点。

不返回-1(含字,则返回true):

<div>Word</div> 

<p>Word</p> 

不会返回-1(返回false包含单词):

<div><p>Word</p></div> 

<div><div>Word</div></div> 

会非常感谢任何帮助,谢谢!

+2

“字”= “字” – forrestmid

+0

@forrestmid哎呦,更新! – Osman

+1

简单的js是一项要求吗?如果你使用jquery,会更容易。 –

var word = "Word" 
var elements = document.querySelectorAll("body > *"); 
function removeContainingText(element) { 
    var children = Array.from(element.childNodes) 
    for (var i = 0; i<children.length; ++i){ 
    if (children[i].nodeType == 3){ 
     if (children[i].nodeValue.indexOf(word) !== -1) { 
      children[i].parentNode.removeChild(children[i]); 
     } 
    } 
    } 
} 
for (var k = 0; k < elements.length; ++k){ 
    removeContainingText(elements[k]) 
} 
+0

试试这个,只需将顶部的单词的值更改为您需要删除的单词的值。 –

+2

谢谢!我通过用'*'来替换'body> *'来实现它的功能 - 它似乎不适用于'body>'部分 – Osman

您可以迭代元素的childNodes,专门针对文本nodeType进行过滤并查找。因为空白可以导致空的文本节点,所以在测试中运行trim。

function containsText(element) { 
    return Array.from(element.childNodes) 
    .some(n=>n.nodeType === 3 && n.textContent.trim().length); 
} 

我们可以把这个基本要素 “包含文字” 逻辑并将其修改为支持特定测试:

function containsText(text, element) { 
    return Array.from(element.childNodes) 
    .some(n=>n.nodeType === 3 && n.textContent.indexOf(text) !== -1); 
} 

,然后用它作为你的循环内的条件:

if (containsText('Word', current)) { 
    current.parentNode.removeChild(current); 
} 
+0

谢谢你提供这个!虽然我怎么能在我的代码中实现这个? – Osman

+0

更新了特定于您的用例的示例。 –

var elements = document.querySelectorAll("body > *"); 
for (var i = 0, len = elements.length; i < len; i++) { 
    var current = elements[i]; 

    if(current.children.length > 0){ 
     continue; 
    } 

    if (current.innerHTML.indexOf("Word") !== -1) { 
     current.parentNode.removeChild(current); 
    } 
}