【问题标题】:Why does $('#table > tr') selector not match? (always return 0)为什么 $('#table > tr') 选择器不匹配? (总是返回 0)
【发布时间】:2012-05-06 15:56:07
【问题描述】:

html代码:

<table id='table'>
    <tr>
        <td>..</td>
    </tr>
</table>

带有jquery的js代码:

var l1 = $('#table > tr').length;
var l2 = $('#table tr').length;
alert(l1+','+l2);​

结果:

 0,1

为什么第一个#table &gt; tr 得到0?

您可以从这里观看现场演示:http://jsfiddle.net/Freewind/PmsFQ/

【问题讨论】:

  • 如果有必要,请转到 other 问题并为此关闭它(这个问题写得更好,更重要)。
  • @pst:完成。知道详细描述说“这与早期问题相同”总是让我有点不安,但我认为在这种情况下没关系。

标签: jquery jquery-selectors


【解决方案1】:

因为&lt;table&gt; 的直接子代只能是&lt;thead&gt;&lt;tbody&gt;&lt;tfoot&gt;(或&lt;colgroup&gt;&lt;caption&gt;,但它们不包含行)。

浏览器的 DOM 将在 &lt;tbody&gt; 中隐式包装流浪的 &lt;tr&gt;s。 (对于不这样做的浏览器,jQuery 会伪造它)

你需要写$('#table &gt; tbody &gt; tr')

【讨论】:

  • 第二句话适用于 HTML(以及 HTML5),但不适用于 XHTML。见these 两个answers
【解决方案2】:

这是因为浏览器会自动在您的&lt;table&gt;&lt;tr&gt; 之间插入&lt;tbody&gt; 元素,这样这些行就不再是您的表的直接子元素了。

【讨论】:

    【解决方案3】:

    您的浏览器正在添加 tbody 元素,因此 tr 不是表的子元素。

    【讨论】:

    • 他们仍然是桌子的直系后代......只是不是它的孩子:-)
    • @Codemonkey 这就是我所说的“直接后代”的意思。但是,是的,孩子更好。
    • @BoltClock 也许在编程中,但在所有参考文献中,我能找到“直系后代”只是意味着遵循一条直线的血统路径,例如我是祖父的直系后裔
    猜你喜欢
    • 2021-01-24
    • 2016-09-16
    • 2020-05-25
    • 2013-02-26
    • 2013-06-25
    • 1970-01-01
    • 2016-04-02
    • 2013-02-14
    相关资源
    最近更新 更多