2010-06-04 6 views
32

Cela ne fonctionne pas, devrait-il? Ou pouvez-vous arrêter l'erreur si une autre ligne pourrait faire la même chose:test si affichage = aucun

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" }); 
} 

J'ai besoin de filtrer les lignes dans une table et un mot couleur. Les données sont devenues beaucoup pour la coloration si beaucoup de mots sont choisis. Je vais donc essayer de limiter la coloration en ne passant que par les éléments non cachés.

Répondre

44

Si vous voulez obtenir les tbody visibles des éléments, vous pouvez le faire:

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

Il ressemble à la réponse que Agent_9191 a donné, mais celui-ci supprime l'espace du sélecteur, ce qui le rend sélectionne les éléments tbody visibles à la place des descendants visibles.


EDIT:

Si vous vouliez spécifiquement utiliser un test sur la propriété display CSS des tbody éléments, vous pouvez le faire:

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

Salut. Le tbody: visible fait le tour très bien. Peut rechercher une grande quantité de données et ne mettre en évidence que le texte affiché. Génial. – Tillebeck

+3

@Tillebeck - Juste pour que vous compreniez, un «espace» dans un sélecteur est un opérateur important. Cela signifie que vous cherchez un descendant. Donc 'tbody: visible' cherche les éléments' tbody' qui sont 'visible', alors que' tbody: visible' cherche les * descendants * de 'tbody' qui sont': visible'. Bonne chance! :) – user113716

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

Essayez plutôt qu'à sélectionner les éléments visibles sous la tbody:

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

Pour une raison quelconque, cela ne fonctionne pas. En supprimant l'espace entre tbody et: visible (tbody: visible), alors cela fonctionne. Je ne peux pas dire si cela devrait fonctionner (je peux avoir un logiciel buggé en cours d'exécution, je ne sais pas). Mais merci beaucoup pour votre réponse. Désolé, mais j'ai indiqué que les patricks répondaient correctement même si c'était presque un de vos clones ;-) – Tillebeck

43

Utilisez comme ceci:

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

H ope ça aide!

+3

Pas la meilleure pratique mais je pense que c'est le meilleur moyen pour les débutants. – tersakyan

+0

Cela fonctionne très bien pour slideToggle et IE8, car IE considère le rembourrage comme la hauteur #justSayin –

+3

@tersakyan Qu'est-ce qu'une bonne pratique ici? –

1

Comme @ Agent_9191 et @partick mentionné, vous devez utiliser

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

ou

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

De plus, puisque vous semblez appliquer une classe aux mots mis en évidence, au lieu d'utiliser jquery pour modifier l'arrière-plan pour tous les reflets correspondants, il suffit de créer une règle CSS avec la couleur d'arrière-plan dont vous avez besoin et il est appliqué directement une fois que vous affectez la classe.

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

Super. Merci pour l'explication.Cela peut expliquer pourquoi seul le dernier fonctionne (tbodys visible). Et oui. CSS devrait aller dans le fichier CSS et ne pas être défini dans divers fichiers js. Tant pour la performance que pour le design, les gars ne sont pas frustrés :-). – Tillebeck

Questions connexes