2010-06-04 24 views
32

Das funktioniert nicht, oder? Oder können Sie den Fehler stoppen, wenn eine andere Linie das gleiche tun könnte:test wenn 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" }); 
} 

Ich brauche Zeilen in einer Tabelle filtern und ein Wort Farbe. Die Daten sind zu viel für die Färbung geworden, wenn viele Wörter gewählt werden. Also werde ich versuchen, die Färbung zu begrenzen, indem ich nur die nicht versteckten Elemente durchlaufe.

Antwort

44

Wenn Sie die sichtbaren tbody Elemente erhalten möchten, können Sie dies tun könnte:

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

Es sieht ähnlich aus wie die Antwort, dass Agent_9191 gab, aber dieses entfernt den Raum aus dem Selektor, der es macht Wählt die sichtbaren tbody Elemente anstelle der sichtbaren Nachkommen aus.


EDIT:

Wenn Sie speziell einen Test auf dem display CSS-Eigenschaft der tbody Elemente verwenden möchten, können Sie dies tun:

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

Hi. Der tbody: visible macht den Trick sehr schön. Kann eine große Datenmenge durchsuchen und nur den angezeigten Text hervorheben. Groß. – Tillebeck

+3

@Tillebeck - Nur so verstehen Sie, ein 'Raum' in einem Selektor ist ein wichtiger Operator. Es bedeutet, dass Sie nach einem Nachkommen suchen. So sucht "tbody: visible" nach "tbody" Elementen, die "sichtbar" sind, während "tbody: visible" nach * Nachkommen * von 'tbody' sucht, die': visible' sind. Viel Glück! :) – user113716

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

Versuchen Sie stattdessen nur auf die sichtbaren Elemente unter dem tbody wählen:

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

Aus irgendeinem Grund funktioniert es nicht. Wenn der Abstand zwischen tbody und: visible (tbody: visible) entfernt wird, funktioniert es. Ich kann nicht sagen, ob es funktionieren sollte (ich kann einige Buggy-Software laufen lassen, weiß nicht). Aber vielen Dank für Ihre Antwort. Sorry, aber ich habe patricks Antwort als richtig markiert obwohl es fast ein Klon von dir war ;-) – Tillebeck

43

Verwendung wie folgt aus:

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

H es hilft!

+3

Nicht Best Practice, aber ich denke, das ist der beste Weg für Anfänger. – tersakyan

+0

Das funktioniert gut für slideToggle und IE8, weil IE Padding die Höhe betrachtet #justSayin –

+3

@tersakyan Was ist eine Best Practice hier? –

1

Als @ Agent_9191 und @partick erwähnt sollten Sie

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

oder

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

Zusätzlich verwenden, da Sie scheinen eine Klasse zu den markierten Worte anwenden, anstatt jquery der Verwendung zu verändern Der Hintergrund für alle übereinstimmenden Hervorhebungen, erstellen Sie einfach eine CSS-Regel mit der benötigten Hintergrundfarbe und sie wird direkt angewendet, sobald Sie die Klasse zuweisen.

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

Super. Danke für die Erklärung.Das erklärt möglicherweise, warum nur das letztere funktioniert (sichtbare tbodys). Und ja. CSS sollte in die CSS-Datei gehen und nicht in verschiedenen js-Dateien definiert sein. Sowohl für die Performance als auch für die Design-Jungs wird es nicht frustriert :-) Werde es tun. – Tillebeck

Verwandte Themen