2009-09-03 10 views
2

J'ai ce sélecteur:jQuery problème de sélection

$("table.details tbody tr:not(.details)") 

Mais je me demande pourquoi cette table intérieure se sélectionnée aussi:

<table class="items details"> 
    <thead> 
     <tr> 
      <th style="width: 90%;">Test application</th> 
      <th style="width: 10%;">Sent to test</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td>6456</td> 
      <td>8/29/2009</td> 
     </tr> 
     <tr class="details"> 
      <td colspan="2"> 
       <table> 
        <tr> 
         <td style="width: 100px;">Description:</td> 
         <td>2312313</td> 
        </tr> 
        <tr> 
         <td colspan="2"></td> 
        </tr> 
        <tr> 
         <td>Test URL Test</td> 
         <td><a href="Test2" title="Visit test application">Test2</a></td> 
        </tr>  
       </table> 
      </td> 
     </tr> 
    </tbody> 
</table> 

Une propriété .length retourne 6, qui est le nombre de au total.

Mais POURQUOI?

+0

Est-ce que toute la table est sélectionnée ou juste un TR de cette table? – jantimon

+0

Juste le TRs est sélectionné – Kordonme

Répondre

4

Vous sélectionnez tous les descendants. Pour sélectionner les enfants immédiats, utilisez ceci:

$("table.details > tbody > tr:not(.details)") 

Cette section dans la documentation jQuery aidera plus: http://docs.jquery.com/Selectors

+0

Essayé que quelques secondes après la publication, mais .length renvoie toujours 6 et il fonctionne maintenant. – Kordonme

+4

doit être $ ("table.details> tbody> tr: not (.details)") – redsquare

+0

Exactement! Cela l'a réparé. Et j'ai regardé le DOM généré et correct, la table interne reçoit aussi un tbody. Comme Blixt a dit. – Kordonme

0

Parce que vous avez plus de lignes qui correspondent aux critères de sélection. Vous devez définir la classe de détails sur toutes vos lignes de la table interne si vous ne voulez pas les sélectionner.

Cela devrait être plus proche de ce que vous voulez:

$("table.details tbody tr:first"); 
+0

Mais il ne veut peut-être pas juste la première ligne, et toute traversée utilisant la méthode nextSibling() pourrait bien être fausse. –

+0

Cela me donnerait seulement un TR :( – Kordonme

+0

Ouais je dois avoir mal compris quelque chose - vous avez dit que vous ne vouliez pas de lignes imbriquées et vous ne voulez pas la rangée de thead ... –

2

Votre sélection correspond à la <tr> de sous-table de s - vous devez changer pour sélectionner les enfants directs au lieu des descendants:

$("table.details > tbody > tr:not(.details)") 

Un élément <tbody> est implicite si <tr> est à l'intérieur de <tbody>, <thead> ou <tfoot>, donc vous avez également besoin que les <tr> s soient des descendants directs du sapin st <tbody>.

1

Pensez espaces entre sélecteurs comme jokers:

table.details * tbody * tr:not(.details) 

Cela devrait vous aider à comprendre pourquoi la table interne est sélectionnée. Pour éviter cela, utilisez les solutions publiées ci-dessus qui utilisent le qualificatif descendant immédiat ">".