Como posso encontrar DIV com determinado texto? Por exemplo:
<div>
SomeText, text continues.
</div>
Tentando usar algo assim:
var text = document.querySelector('div[SomeText*]').innerTEXT;
alert(text);
Mas é claro que não vai funcionar. Como eu posso fazer isso?
Respostas:
A pergunta do OP é sobre JavaScript puro e não jQuery . Embora haja uma abundância de respostas e eu como @Pawan Nogariya resposta , por favor, veja isto alternativa.
Você pode usar XPATH em JavaScript. Mais informações sobre o artigo MDN aqui .
O
document.evaluate()
método avalia uma consulta / expressão XPATH. Portanto, você pode passar expressões XPATH lá, ir para o documento HTML e localizar o elemento desejado.No XPATH você pode selecionar um elemento, pelo nó de texto como o seguinte, que obtém o
div
que possui o nó de texto a seguir.Para obter um elemento que contém algum texto, use o seguinte:
O
contains()
método em XPATH leva um nó como primeiro parâmetro e o texto a ser pesquisado como segundo parâmetro.Verifique este plunk aqui , este é um exemplo de uso de XPATH em JavaScript
Aqui está um snippet de código:
Como você pode ver, posso pegar o elemento HTML e modificá-lo como quiser.
fonte
alert(thisHeading.textContent.replace(/.*You have login (.*) times.*/,'$1')) ;
.evaluate()
usa. Por favor, alguém me corrija se eu estiver errado), então, em primeiro lugar, você não pode pesquisar por algo que corresponda a uma expressão regular. Em segundo lugar, a.textContent
propriedade retorna o nó de texto do elemento. Se você deseja obter um valor deste texto, deve tratá-lo explicitamente, provavelmente criando algum tipo de função que corresponda a uma regex e retorne o valor correspondente no grupo. Para isso, faça uma nova pergunta em um tópico separado.Você poderia usar esta solução bastante simples:
O
Array.from
irá converter a NodeList em uma matriz (existem vários métodos para fazer isso, como o operador de propagação ou fatia)O resultado agora sendo um array permite o uso do
Array.find
método, você pode então colocar qualquer predicado. Você também pode verificar o textContent com um regex ou o que quiser.Observe que
Array.from
eArray.find
são recursos do ES2015. Ser compatível com navegadores mais antigos como o IE10 sem um transpiler:fonte
find
porfilter
.Já que você perguntou em javascript, você pode ter algo assim
E então chame assim
fonte
[object HTMLDivElement],[object HTMLDivElement]
foundDivs[0].innerText
, tão simplesEsta solução faz o seguinte:
Usa o operador spread ES6 para converter a NodeList de todos os
div
s em uma matriz.Fornece saída se
div
contiver a string de consulta, não apenas se for exatamente igual à string de consulta (o que acontece com algumas das outras respostas). Por exemplo, deve fornecer saída não apenas para 'AlgumTexto', mas também para 'AlgumTexto, o texto continua'.Produz todo o
div
conteúdo, não apenas a string de consulta. por exemplo, para 'AlgumTexto, o texto continua', ele deve imprimir toda a string, não apenas 'AlgumTexto'.Permite que vários
div
s contenham a string, não apenas um únicodiv
.fonte
innerHTML
dos seus programas principais<div>
. Você deve filtrar osdiv
s que contêm filhos primeiro. Também suspeitodocument.getElementsByTagName('div')
pode ser mais rápido, mas eu faria um benchmark para ter certeza.É melhor você ver se tem um elemento pai do div que está consultando. Se for assim, obtenha o elemento pai e execute um
element.querySelectorAll("div")
. Depois de obter o,nodeList
aplique um filtro sobre ainnerText
propriedade. Suponha que um elemento pai do div que estamos consultando tenha umid
decontainer
. Normalmente, você pode acessar o container diretamente do id, mas vamos fazer isso da maneira correta.Então é isso.
fonte
Se você não quiser usar jquery ou algo parecido, você pode tentar isto:
Depois de ter os nós em uma matriz que contém o texto, você pode fazer algo com eles. Como alertar cada um ou imprimir no console. Uma advertência é que isso pode não necessariamente capturar divs por si só, isso irá capturar o pai do textnode que contém o texto que você está procurando.
fonte
Como não há limites para o comprimento do texto em um atributo de dados, use atributos de dados! E então você pode usar seletores css regulares para selecionar seu (s) elemento (s) como o OP deseja.
O ideal é que você faça a parte de configuração do atributo de dados no carregamento do documento e restrinja um pouco o seletor querySelectorAll para desempenho.
fonte
O Google tem isso como um resultado principal para quem precisa encontrar um nó com determinado texto. Por meio de atualização, uma lista de nós agora pode ser iterada em navegadores modernos, sem a necessidade de convertê-la em um array.
A solução pode usar o forEach dessa forma.
Isso funcionou para mim fazer um localizar / substituir texto dentro de uma lista de nós quando um seletor normal não podia escolher apenas um nó, então tive que filtrar cada nó um por um para verificar se havia agulha.
fonte
Use XPath e document.evaluate () e certifique-se de usar text () e não. para o argumento contains (), ou então você terá o HTML inteiro, ou o elemento div mais externo correspondido.
ou ignore os espaços em branco à esquerda e à direita
ou corresponder a todos os tipos de tag (div, h1, p, etc.)
Em seguida, itere
fonte
thisheading.setAttribute('class', "esubject")
Aqui está a abordagem XPath, mas com um mínimo de jargão XPath.
Seleção regular com base nos valores dos atributos do elemento (para comparação):
Seleção XPath com base no texto dentro do elemento.
E aqui está a não diferenciação de maiúsculas e minúsculas, já que o texto é mais volátil:
fonte
Eu tive um problema semelhante.
Função que retorna todos os elementos que incluem texto de arg.
Isso funciona para mim:
}
fonte
Já existem muitas soluções excelentes aqui. No entanto, para fornecer uma solução mais simplificada e mais consistente com a ideia de um comportamento e sintaxe querySelector, optei por uma solução que estende Object com algumas funções de protótipo. Ambas as funções usam expressões regulares para correspondência de texto, no entanto, uma string pode ser fornecida como um parâmetro de pesquisa flexível.
Simplesmente implemente as seguintes funções:
Com essas funções implementadas, agora você pode fazer chamadas da seguinte maneira:
document.queryInnerTextAll('div.link', 'go');
Isso iria encontrar todos os divs contendo o link de classe com a palavra go na innerText (eg. Ir Esquerda ou ir para baixo ou ir para a direita ou E do Go od )
document.queryInnerText('div.link', 'go');
Isso funcionaria exatamente como o exemplo acima, exceto que retornaria apenas o primeiro elemento correspondente.
document.queryInnerTextAll('a', /^Next$/);
Encontre todos os links com o texto exato Próximo ( diferencia maiúsculas de minúsculas). Isso excluirá links que contenham a palavra Próximo junto com outro texto.
document.queryInnerText('a', /next/i);
Encontre o primeiro link que contém a palavra seguinte , independentemente do caso (por exemplo, Próxima página ou Ir para a próxima )
e = document.querySelector('#page');
e.queryInnerText('button', /Continue/);
Isso executa uma pesquisa dentro de um elemento de contêiner para um botão que contém o texto Continue ( diferencia maiúsculas de minúsculas). (por exemplo, continuar ou continuar para o próximo, mas não continuar )
fonte