2009-09-03 84 views
2

我有这样的选择:jQuery选择问题

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

但为什么这种内在的表被选中过我想知道:

<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> 

一个。长度属性返回6,这是多少总共。

但为什么?

+0

整个表是被选中还是仅仅是这张表的TR? – jantimon 2009-09-03 07:23:10

+0

只是TR被选中 – Kordonme 2009-09-03 07:26:00

回答

4

您的选择器正在选择所有的后代。因为你有符合标准的选择,更多的行http://docs.jquery.com/Selectors

+0

尝试发布几秒后,但.length仍然返回6,它现在正在工作。 – Kordonme 2009-09-03 07:26:57

+4

应该是$(“table.details> tbody> tr:not(.details)”) – redsquare 2009-09-03 07:27:13

+0

Exactually!这固定了它。我看着正在生成的DOM和正确的,内部表也得到一个tbody。像Blixt说的。 – Kordonme 2009-09-03 07:32:14

0

:要选择直接孩子,用这个:

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

本节jQuery的文档将帮助更多。如果您不想选择它们,则需要在所有内部表格行上设置详细信息类。

你想要什么这应该是接近:

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

但他可能不想要第一行,并且任何使用nextSibling()方法的遍历都可能是错误的。 – 2009-09-03 07:31:21

+0

这会给我只有一个TR :( – Kordonme 2009-09-03 07:31:43

+0

是的,我一定误解了一些东西 - 你说你不想嵌套的行,你不想要的行...... – 2009-09-03 07:48:47

2

你选择的子表的<tr> s比 - 你需要去改变它选择直接孩子而后裔:

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

如果<tr>位于<tbody>,<thead><tfoot>之内,则暗示<tbody>元素,因此您还需要<tr>作为fir的直接后代st <tbody>

1

的选择之间的间隔觉得作为通配符:

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

这会帮助你理解为什么被选择的内表。为了避免这种情况,请使用上面提到的使用“>”立即后代限定符的解决方案。