Supponiamo che una pagina web abbia una stringa come "I am a simple string" che voglio trovare. Come potrei fare questo usando JQuery?
Supponiamo che una pagina web abbia una stringa come "I am a simple string" che voglio trovare. Come potrei fare questo usando JQuery?
Risposte:
jQuery ha il metodo contiene. Ecco un frammento per te:
<script type="text/javascript">
$(function() {
var foundin = $('*:contains("I am a simple string")');
});
</script>
Il selettore sopra seleziona qualsiasi elemento che contiene la stringa di destinazione. Il foundin sarà un oggetto jQuery che contiene qualsiasi elemento corrispondente. Consulta le informazioni sull'API su: https://api.jquery.com/contains-selector/
Una cosa da notare con il carattere jolly '*' è che otterrai tutti gli elementi, incluso il tuo html e gli elementi del corpo, che probabilmente non vuoi. Ecco perché la maggior parte degli esempi su jQuery e in altri luoghi usa $ ('div: contiene ("I am a simple string")')
Normalmente i selettori jQuery non effettuano ricerche all'interno dei "nodi di testo" nel DOM. Tuttavia, se si utilizza la funzione .contents (), verranno inclusi i nodi di testo, quindi è possibile utilizzare la proprietà nodeType per filtrare solo i nodi di testo e la proprietà nodeValue per cercare la stringa di testo.
$ ('*', 'body') .andSelf () .Contenuti() .filter (function () { restituisce this.nodeType === 3; }) .filter (function () { // Corrisponde solo quando contiene "stringa semplice" in qualsiasi punto del testo restituisce this.nodeValue.indexOf ('stringa semplice')! = -1; }) .each (function () { // Fai qualcosa con this.nodeValue });
.andSelf()
. Da api.jquery.com/andSelf : "Gli oggetti jQuery mantengono uno stack interno che tiene traccia delle modifiche al set di elementi abbinato. Quando viene chiamato uno dei metodi di attraversamento DOM, il nuovo set di elementi viene inserito nello stack. Se si desidera anche il set di elementi precedente, .andSelf () può aiutare. " Non vedo alcun contesto precedente, cosa mi sto perdendo?
Questo selezionerà solo gli elementi foglia che contengono "I am a simple string".
$('*:contains("I am a simple string")').each(function(){
if($(this).children().length < 1)
$(this).css("border","solid 2px red") });
Incolla quanto segue nella barra degli indirizzi per testarlo.
javascript: $('*:contains("I am a simple string")').each(function(){ if($(this).children().length < 1) $(this).css("border","solid 2px red") }); return false;
Se vuoi prendere solo "I am a simple string" . Prima avvolgi il testo in un elemento come questo.
$('*: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 poi fai questo.
$('*[containsStringImLookingFor]').css("border","solid 2px red");
Se vuoi solo il nodo più vicino al testo che stai cercando, puoi usare questo:
$('*:contains("my text"):last');
Funzionerà anche se il tuo HTML è simile al seguente:
<p> blah blah <strong>my <em>text</em></strong></p>
Usando il selettore sopra troverai il <strong>
tag, dato che è l'ultimo tag che contiene l'intera stringa.
<p>my text <b>my text</b></p>
- rimuovere gli antenati del <b>
tag sarebbe perde l'altra partita
Dai un'occhiata all'evidenziazione (plugin jQuery).
Sto solo aggiungendo alla risposta di Tony Miller perché questo mi ha portato il 90% verso quello che stavo cercando ma che ancora non ha funzionato. L'aggiunta .length > 0;
alla fine del suo codice ha fatto funzionare il mio script.
$(function() {
var foundin = $('*:contains("I am a simple string")').length > 0;
});
foundin += '*';
questa funzione dovrebbe funzionare. fondamentalmente esegue una ricerca ricorsiva fino a quando non otteniamo un elenco distinto di nodi foglia.
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;
}