Reputation: 97
Is there a way to find HTML Elements that contain specific text in vanilla JavaScript?
(Like $( ':contains(text)' )
in jQuery)
*Excluding parent elements. You should only find the element that immediately wraps the text.
Upvotes: 1
Views: 1318
Reputation: 56803
To avoid also getting all the ancestors of the actual elements containing what you are searching for, you'll have to go with an approach like this:
const searchString = 'foo';
function findByText(needle, haystack = document) {
return [...haystack.querySelectorAll('*')].reduce(
(acc, val) => {
for (const {
nodeType,
textContent,
parentElement
} of val.childNodes) {
if (nodeType === 3 && textContent.includes(needle) && !(parentElement.tagName === 'SCRIPT')) acc.push(parentElement);
}
return acc;
}, []
);
}
console.log(findByText(searchString));
<div>
<span>
<em> foobar ftw</em>
</span>
</div>
Upvotes: 4