2010-11-17 3 views
2

Dans JQuery, il est facile de masquer une ligne de table en fonction d'une colonne prédéfinie. La valeur td est facile à l'aide du code suivant. Cependant, comment pourrais-je faire pour montrer les lignes qui correspondent aux valeurs td dans plus d'une colonne?Afficher les lignes en fonction des valeurs dans plusieurs colonnes. JQuery

Quelque chose comme ce qui suit (ce qui ne fonctionne pas)

function filterRows(word){ 
$('.application>tbody>tr') 
.show() 
.find('td:nth-child(2)').not(':contains("'+word+'")') 
.find('td:nth-child(3)').not(':contains(30)') 
.parent() 
.hide() 
} 

Fondamentalement, je veux être en mesure de montrer que les lignes où mon mot est passé dans « mot » est dans la deuxième colonne td et la troisième colonne contient "30".

Merci pour tout heads up.

Répondre

4

Vous pouvez utiliser .end() de sauter en arrière dans la chaîne, comme ceci:

function filterRows(word){ 
    $('.application>tbody>tr').show() 
    .find('td:nth-child(2)').not(':contains("'+word+'")').parent().hide() 
    .end().end().end() //back 3 spots for parent, not and find 
    .find('td:nth-child(3)').not(':contains(30)').parent().hide(); 
} 

Bien que, dans ce Enchaînement de cas est un peu bavard, il faut garder une référence dans une variable, comme ceci:

function filterRows(word){ 
    var rows = $('.application>tbody>tr').show(); 
    rows.find('td:nth-child(2):not(:contains("'+word+'"))').parent().hide(); 
    rows.find('td:nth-child(3):not(:contains(30))').parent().hide(); 
} 

Ou un peu plus complexe sélecteur:

function filterRows(word){ 
    $('.application>tbody>tr').show() 
    .find('td:nth-child(2):not(:contains("'+word+'")), td:nth-child(3):not(:contains(30))').parent().hide(); 
} 
+0

Merci pour la solution à mon problème.J'ai utilisé le sélecteur dans le 3ème bloc de code. Le prochain arrêt est d'obtenir un livre sur JQuery et de l'apprendre plus en profondeur pour comprendre où les sélecteurs peuvent être imbriqués, etc. –

0

Que diriez-vous de mettre .parent() après la première découverte.

.find('td:nth-child(2)').not(':contains("'+word+'")').parent() 
+0

Cela ferait en sorte que la deuxième recherche ne regarde que dans les résultats de la première recherche. –

+0

Je pense qu'il veut sélectionner des lignes qui satisfont les deux conditions (conjonction), donc il ne sert à rien d'espérer revenir dans le set précédent. Quelques expériences herE: http://jsfiddle.net/N25pM/ – Lachezar

0
function filterrows(word) { 
    var row = $(".application>tbody>tr"); 
    row.each(function() { 
    $this = $(this); 
    var secondColumn = $('td:nth-child(2):not(contains("'+word+'"))', $this) 
    var thirdColumn= $('td:nth-child(2):not(:contains("30")', $this) 
    if (secondColumn.length && thridcolumn.length) { //if you find both a second and third column that matches 
     $this.hide(); 
    } else { //if the second and third column dont match 
     $this.show(); 
    } 
    }); 
} 
+0

Cela déclencherait le moteur de sélection '2n + 1' fois,' n' étant le nombre de lignes ... plus créer environ '2n' plus d'objets jQuery ... la performance serait très, très mauvaise surtout avec des tables plus grandes. De plus, ce n'est pas correct, votre vérification 'if' serait toujours' true' puisque vous vérifiez 'if (jQueryObject && jQueryObject)'. –

0

est ici d'une manière plus efficace de le faire:

function filterRows(word){ 
    $('.application>tbody>tr').show() 
     .filter(function() { 
      return this.cells[ 1 ].innerHTML.indexOf(word) < 0 || 
        this.cells[ 2 ].innerHTML.indexOf("30") < 0; 
     }).hide() 
} 

S'il y a des balises imbriquées, une approche légèrement différente doit être prise dans le filtre. Dans ce cas, vous devez remplacer this.cells[ 1 ].innerHTML avec:

(this.cells[ 1 ].innerText || this.cells[ 1 ].textContent) 

(Même chose pour cells[ 2 ] bien sûr.)


EDIT: Je eu && au lieu de ||. On dirait que l'exigence est de .show() si les deux correspondances sont trouvées. Fixé. Maintenant, il se cachera si l'une ou l'autre correspondance n'est pas trouvée.

Questions connexes