Alguém pode me dizer se é possível encontrar um elemento com base em seu conteúdo, e não por um ID ou classe ?
Estou tentando encontrar elementos que não têm classes ou IDs distintos. (Então, preciso encontrar o pai desse elemento.)
Alguém pode me dizer se é possível encontrar um elemento com base em seu conteúdo, e não por um ID ou classe ?
Estou tentando encontrar elementos que não têm classes ou IDs distintos. (Então, preciso encontrar o pai desse elemento.)
Respostas:
Você pode usar o :contains
seletor para obter elementos com base em seu conteúdo.
$('div:contains("test")').css('background-color', 'red');
<div>This is a test</div>
<div>Another Div</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
.filter
. $('div').filter(function(){ return $(this).text().toLowerCase() === 'test';})
$('div:contains( "test" )').css('background-color', 'red');
Na documentação do jQuery, diz:
O texto correspondente pode aparecer diretamente dentro do elemento selecionado, em qualquer um dos descendentes desse elemento ou em uma combinação
Portanto, não basta usar o :contains()
seletor , você também precisa verificar se o texto que você procura é o conteúdo direto do elemento que você está alvejando, algo assim:
function findElementByText(text) {
var jSpot = $("b:contains(" + text + ")")
.filter(function() { return $(this).children().length === 0;})
.parent(); // because you asked the parent of that element
return jSpot;
}
<li>Hello <a href='#'>World</a>, How Are You.
. Aqui, se How
estiver sendo pesquisado, a condição falhará, eu acho.
Pessoal, eu sei que isso é antigo, mas ei, eu tenho essa solução que acho que funciona melhor do que todas. Em primeiro lugar, supera a sensibilidade de maiúsculas e minúsculas que o jquery: contém () é enviado com:
var text = "text";
var search = $( "ul li label" ).filter( function ()
{
return $( this ).text().toLowerCase().indexOf( text.toLowerCase() ) >= 0;
}).first(); // Returns the first element that matches the text. You can return the last one with .last()
Espero que alguém no futuro próximo considere útil.
A resposta de Rocket não funciona.
<div>hhhhhh
<div>This is a test</div>
<div>Another Div</div>
</div>
Simplesmente modifiquei sua DEMO aqui e você pode ver que o DOM raiz está selecionado.
$('div:contains("test"):last').css('background-color', 'red');
adicione o seletor " : last " no código para corrigir isso.
Melhor maneira na minha opinião.
$.fn.findByContentText = function (text) {
return $(this).contents().filter(function () {
return $(this).text().trim() == text.trim();
});
};
Sim, use o contains
seletor jQuery .
O jQuery a seguir seleciona nós div que contêm texto, mas não têm filhos, que são os nós folha da árvore DOM.
$('div:contains("test"):not(:has(*))').css('background-color', 'red');
<div>div1
<div>This is a test, nested in div1</div>
<div>Nested in div1<div>
</div>
<div>div2 test
<div>This is another test, nested in div2</div>
<div>Nested in div2</div>
</div>
<div>
div3
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>