Digamos que uma página da Web tenha uma sequência como "Eu sou uma sequência simples" que desejo encontrar. Como eu faria isso usando o JQuery?
Digamos que uma página da Web tenha uma sequência como "Eu sou uma sequência simples" que desejo encontrar. Como eu faria isso usando o JQuery?
Respostas:
O jQuery possui o método contains. Aqui está um trecho para você:
<script type="text/javascript">
$(function() {
var foundin = $('*:contains("I am a simple string")');
});
</script>
O seletor acima seleciona qualquer elemento que contenha a sequência de destino. O foundin será um objeto jQuery que contém qualquer elemento correspondente. Consulte as informações da API em: https://api.jquery.com/contains-selector/
Uma coisa a se notar com o curinga '*' é que você obterá todos os elementos, incluindo os elementos html e body, que provavelmente não deseja. É por isso que a maioria dos exemplos no jQuery e em outros lugares usa $ ('div: contains ("sou uma string simples")')
Normalmente, os seletores de jQuery não pesquisam nos "nós de texto" no DOM. No entanto, se você usar a função .contents (), os nós de texto serão incluídos, e você poderá usar a propriedade nodeType para filtrar apenas os nós de texto e a propriedade nodeValue para pesquisar a sequência de texto.
$ ('*', 'corpo') .andSelf () .conteúdo() .filter (function () { retorne this.nodeType === 3; }) .filter (function () { // Corresponde apenas quando contém 'string simples' em qualquer lugar do texto retorne this.nodeValue.indexOf ('string simples')! = -1; }) .each (function () { // Faça algo com this.nodeValue });
.andSelf()
. Em api.jquery.com/andSelf : "os objetos jQuery mantêm uma pilha interna que controla as alterações no conjunto de elementos correspondente. Quando um dos métodos de passagem DOM é chamado, o novo conjunto de elementos é empurrado para a pilha. Se o conjunto anterior de elementos também é desejado, .eSelf () pode ajudar. " Não vejo contexto anterior, o que estou perdendo?
Isso selecionará apenas os elementos da folha que contêm "Eu sou uma sequência simples".
$('*:contains("I am a simple string")').each(function(){
if($(this).children().length < 1)
$(this).css("border","solid 2px red") });
Cole o seguinte na barra de endereço para testá-lo.
javascript: $('*:contains("I am a simple string")').each(function(){ if($(this).children().length < 1) $(this).css("border","solid 2px red") }); return false;
Se você quiser pegar apenas "Eu sou uma string simples" . Primeiro, envolva o texto em um elemento como esse.
$('*:contains("I am a simple string")').each(function(){
if($(this).children().length < 1)
$(this).html(
$(this).text().replace(
/"I am a simple string"/
,'<span containsStringImLookingFor="true">"I am a simple string"</span>'
)
)
});
e então faça isso.
$('*[containsStringImLookingFor]').css("border","solid 2px red");
Se você deseja apenas o nó mais próximo do texto que está procurando, você pode usar o seguinte:
$('*:contains("my text"):last');
Isso funcionará mesmo se o seu HTML estiver assim:
<p> blah blah <strong>my <em>text</em></strong></p>
O uso do seletor acima encontrará a <strong>
tag, pois essa é a última tag que contém toda a string.
<p>my text <b>my text</b></p>
- remover os ancestrais da <b>
tag perder a outra partida
Dê uma olhada no destaque (plugin jQuery).
Apenas adicionando à resposta de Tony Miller, isso me deu 90% do que eu estava procurando, mas ainda não funcionou. Adicionando .length > 0;
ao final de seu código, meu script funcionou.
$(function() {
var foundin = $('*:contains("I am a simple string")').length > 0;
});
foundin += '*';
esta função deve funcionar. basicamente faz uma pesquisa recursiva até obter uma lista distinta de nós de folha.
function distinctNodes(search, element) {
var d, e, ef;
e = [];
ef = [];
if (element) {
d = $(":contains(\""+ search + "\"):not(script)", element);
}
else {
d = $(":contains(\""+ search + "\"):not(script)");
}
if (d.length == 1) {
e.push(d[0]);
}
else {
d.each(function () {
var i, r = distinctNodes(search, this);
if (r.length === 0) {
e.push(this);
}
else {
for (i = 0; i < r.length; ++i) {
e.push(r[i]);
}
}
});
}
$.each(e, function () {
for (var i = 0; i < ef.length; ++i) {
if (this === ef[i]) return;
}
ef.push(this);
});
return ef;
}