¿Cómo puedo encontrar DIV con cierto texto? Por ejemplo:
<div>
SomeText, text continues.
</div>
Intentando usar algo como esto:
var text = document.querySelector('div[SomeText*]').innerTEXT;
alert(text);
Pero, por supuesto, no funcionará. ¿Cómo puedo hacerlo?
javascript
innertext
selectors-api
passwd
fuente
fuente
Respuestas:
La pregunta de OP es sobre JavaScript simple y no sobre jQuery . Aunque hay muchas respuestas y me gusta la respuesta de @Pawan Nogariya , consulte esta alternativa.
Puede utilizar XPATH en JavaScript. Más información sobre el artículo de MDN aquí .
El
document.evaluate()
método evalúa una consulta / expresión XPATH. Entonces puede pasar expresiones XPATH allí, atravesar el documento HTML y ubicar el elemento deseado.En XPATH puede seleccionar un elemento, por el nodo de texto como el siguiente, que obtiene el
div
que tiene el siguiente nodo de texto.Para obtener un elemento que contiene algo de texto, use lo siguiente:
El
contains()
método en XPATH toma un nodo como primer parámetro y el texto a buscar como segundo parámetro.Compruebe este plunk aquí , este es un ejemplo de uso de XPATH en JavaScript
Aquí hay un fragmento de código:
Como puede ver, puedo tomar el elemento HTML y modificarlo como quiera.
fuente
alert(thisHeading.textContent.replace(/.*You have login (.*) times.*/,'$1')) ;
.evaluate()
usa. Por favor, alguien me corrija si me equivoco), así que en primer lugar, no puede buscar algo que coincida con una expresión regular. En segundo lugar, la.textContent
propiedad devuelve el nodo de texto del elemento. Si desea tomar un valor de este texto, debe manejarlo explícitamente, probablemente creando algún tipo de función que coincida con una expresión regular y devuelva el valor coincidente en el grupo. Para eso, haga una nueva pregunta en un hilo separado.Podrías usar esta solución bastante simple:
El
Array.from
convertirá el NodeList a una matriz (hay varios métodos para hacer esto como el operador de difusión o una rebanada)El resultado ahora es una matriz que permite usar el
Array.find
método, luego puede colocar cualquier predicado. También puede verificar el textContent con una expresión regular o lo que quiera.Tenga en cuenta que
Array.from
yArray.find
son características de ES2015. Ser compatible con navegadores más antiguos como IE10 sin un transpilador:fuente
find
confilter
.Como lo ha pedido en javascript, puede tener algo como esto
Y luego llámalo así
fuente
[object HTMLDivElement],[object HTMLDivElement]
foundDivs[0].innerText
, así de simpleEsta solución hace lo siguiente:
Utiliza el operador de propagación de ES6 para convertir la NodeList de todos los correos electrónicos
div
en una matriz.Proporciona salida si
div
contiene la cadena de consulta, no solo si es exactamente igual a la cadena de consulta (lo que ocurre con algunas de las otras respuestas). Por ejemplo, debería proporcionar resultados no solo para 'SomeText' sino también para 'SomeText, el texto continúa'.Muestra todo el
div
contenido, no solo la cadena de consulta. Por ejemplo, para 'Algún texto, el texto continúa' debería generar esa cadena completa, no solo 'Algún texto'.Permite que varios mensajes de correo
div
electrónico contengan la cadena, no solo unodiv
.fuente
innerHTML
es para sus top-most<div>
s.div
Primero debe filtrar los mensajes de correo electrónico que contengan hijos. También sospecho quedocument.getElementsByTagName('div')
puede ser más rápido, pero lo compararía para estar seguro.Es mejor que vea si tiene un elemento padre del div que está consultando. Si es así, obtenga el elemento padre y realice un
element.querySelectorAll("div")
. Una vez que obtenga el,nodeList
aplique un filtro sobre lainnerText
propiedad. Suponga que un elemento padre del div que estamos consultando tiene un valorid
decontainer
. Normalmente puede acceder al contenedor directamente desde la identificación, pero hagámoslo de la manera correcta.Eso es todo.
fuente
Si no quieres usar jquery o algo así, puedes probar esto:
Una vez que tenga los nodos en una matriz que contenga el texto, puede hacer algo con ellos. Como alertar a cada uno o imprimir a consola. Una advertencia es que esto no necesariamente tomará divs per se, esto tomará el padre del textnode que tiene el texto que está buscando.
fuente
Dado que no hay límites para la longitud del texto en un atributo de datos, ¡use atributos de datos! Y luego puede usar selectores css regulares para seleccionar su (s) elemento (s) como el OP quiere.
Idealmente, realiza la parte de configuración de atributos de datos en la carga del documento y reduce un poco el selector querySelectorAll para mejorar el rendimiento.
fuente
Google tiene esto como un resultado superior para aquellos que necesitan encontrar un nodo con cierto texto. A modo de actualización, una lista de nodos ahora es iterable en los navegadores modernos sin tener que convertirla en una matriz.
La solución puede usar forEach así.
Esto funcionó para mí para buscar / reemplazar texto dentro de una lista de nodos cuando un selector normal no podía elegir solo un nodo, así que tuve que filtrar cada nodo uno por uno para verificar la aguja.
fuente
Use XPath y document.evaluate (), y asegúrese de usar text () y no. para el argumento contains (), o de lo contrario tendrá todo el HTML o el elemento div más externo coincidente.
o ignorar los espacios en blanco iniciales y finales
o coincidir con todos los tipos de etiquetas (div, h1, p, etc.)
Luego itera
fuente
thisheading.setAttribute('class', "esubject")
Este es el enfoque XPath pero con un mínimo de jerga XPath.
Selección regular basada en valores de atributos de elementos (para comparación):
Selección XPath basada en texto dentro del elemento.
Y aquí está la insensibilidad a mayúsculas y minúsculas, ya que el texto es más volátil:
fuente
Tuve un problema similar.
Función que devuelve todos los elementos que incluyen texto de arg.
Esto funciona para mi:
}
fuente
Aquí ya hay muchas soluciones geniales. Sin embargo, para brindar una solución más ágil y más acorde con la idea de un comportamiento y sintaxis de querySelector, opté por una solución que amplíe Object con un par de funciones prototipo. Ambas funciones utilizan expresiones regulares para hacer coincidir el texto, sin embargo, se puede proporcionar una cadena como parámetro de búsqueda flexible.
Simplemente implemente las siguientes funciones:
Con estas funciones implementadas, ahora puede realizar llamadas de la siguiente manera:
document.queryInnerTextAll('div.link', 'go');
Esto encontraría todos los divs que contienen el enlace de clase con la palabra ir en el innerText (por ejemplo. Ir izquierda o ir hacia abajo o ir a la derecha o Es Go od )
document.queryInnerText('div.link', 'go');
Esto funcionaría exactamente como en el ejemplo anterior, excepto que solo devolvería el primer elemento coincidente.
document.queryInnerTextAll('a', /^Next$/);
Encuentre todos los enlaces con el texto exacto Siguiente (distingue entre mayúsculas y minúsculas). Esto excluirá los enlaces que contienen la palabra Siguiente junto con otro texto.
document.queryInnerText('a', /next/i);
Busque el primer enlace que contiene la palabra siguiente , independientemente del caso (por ejemplo, Página siguiente o Ir a la siguiente )
e = document.querySelector('#page');
e.queryInnerText('button', /Continue/);
Esto realiza una búsqueda dentro de un elemento contenedor para un botón que contiene el texto, Continuar ( distingue entre mayúsculas y minúsculas). (p.ej. continuar o continuar con el siguiente pero no continuar )
fuente