2010-06-04 9 views
32

Questo non funziona, dovrebbe? Oppure si può fermare l'errore se un'altra linea potrebbe fare lo stesso:test se display = none

function doTheHighlightning(searchTerms) { 
    // loop through input array of search terms 
    myArray = searchTerms.split(" "); 
    for(i=0;i<myArray.length;i++) 
    { 
     // works. this line works if not out commented. Will highlight all words, also in the hidden elements 
     //$('tbody').highlight(myArray[i]); 

     // not working when trying to skip elements with display none... 
     $('tbody').css('display') != 'none').highlight(myArray[i]); 
    } 

    // set background to yellow for highlighted words 
    $(".highlight").css({ backgroundColor: "#FFFF88" }); 
} 

ho bisogno di filtrare le righe in una tabella e colorare una parola. I dati sono diventati molto utili per la colorazione se vengono scelte molte parole. Quindi cercherò di limitare la colorazione passando solo attraverso gli elementi nascosti.

risposta

44

Se si desidera ottenere i visibili tbody elementi, si potrebbe fare questo:

$('tbody:visible').highlight(myArray[i]); 

E ' sembra simile alla risposta data da Agent_9191, ma questa rimuove lo spazio dal selettore, il che lo rende seleziona gli elementi visibili tbody invece dei discendenti visibili.


EDIT:

Se specificamente voleva utilizzare un test sulla proprietà display CSS dei tbody elementi, si potrebbe fare questo:

$('tbody').filter(function() { 
    return $(this).css('display') != 'none'; 
}).highlight(myArray[i]); 
+0

Ciao. Il tbody: visibile fa il trucco molto bene. Può cercare una grande quantità di dati e evidenziare solo il testo visualizzato. Grande. – Tillebeck

+3

@Tillebeck - Solo così capisci, uno 'spazio' in un selettore è un operatore importante. Significa che stai cercando un discendente. Quindi 'tbody: visible' cerca gli elementi' tbody' che sono 'visible', mentre' tbody: visible' cerca * discendenti * di 'tbody' che sono': visible'. Buona fortuna! :) – user113716

1
$('tbody').find('tr:visible').hightlight(myArray[i]); 
5

Prova a modificare per selezionare solo gli elementi visibili sotto la tbody:

$('tbody :visible').highlight(myArray[i]); 
+0

Per qualche motivo non funziona. Quando rimuovi lo spazio tra tbody e: visible (tbody: visible), allora funziona. Non posso dire se dovrebbe funzionare (potrei avere un buggy in esecuzione, non so). Ma grazie mille per la tua risposta. Scusate, ma ho contrassegnato la risposta come giusta, anche se era quasi un vostro clone ;-) – Tillebeck

43

Usa in questo modo:

if($('#foo').is(':visible')) { 
    // it's visible, do something 
} 
else { 
    // it's not visible so do something else 
} 

H ope aiuta!

+3

Non è una buona pratica, ma penso che questo sia il modo migliore per i principianti. – tersakyan

+0

Funziona alla grande per slideToggle e IE8 perché IE considera il riempimento come l'altezza #justSayin –

+3

@tersakyan Qual è una best practice qui? –

1

Come @ Agent_9191 e @partick menzionato si dovrebbe usare

$('tbody :visible').highlight(myArray[i]); // works for all children of tbody that are visible 

o

$('tbody:visible').highlight(myArray[i]); // works for all visible tbodys 

Inoltre, dal momento che sembra essere l'applicazione di una classe per le parole evidenziate, invece di utilizzare jQuery per alterare lo sfondo per tutte le evidenziazioni abbinate, basta creare una regola css con il colore di sfondo necessario e viene applicata direttamente una volta assegnata la classe.

.highlight { background-color: #FFFF88; } 
+0

Super. Grazie per la spiegazione.Ciò potrebbe spiegare perché solo quest'ultimo funziona (visibile da parte di tbodys). E sì I CSS dovrebbero andare nel file CSS e non essere definiti in vari file js. Sia per le prestazioni, ma anche per il design, i ragazzi non si sentono frustrati :-) Lo farà. – Tillebeck

Problemi correlati