¿Hay alguna forma de encontrar elementos HTML que contengan texto específico en JavaScript estándar? (Como $( ':contains(text)' ) en jQuery)
*Excluyendo los elementos principales. Solo debe encontrar el elemento que envuelve inmediatamente el texto.
Puedes usar filter :
[...document.querySelectorAll('*')].filter(el => el.textContent.includes(text))Como se señaló correctamente, eso también le dará todos los ancestros de los elementos que está buscando.
Así que aquí hay un enfoque diferente:
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>