2012-05-06 15 views
7

kod HTML:

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

Kod js z jquery:

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

Rezultat:

0,1 

Dlaczego pierwszy #table > tr dostać 0?

Można zobacz demo stąd: http://jsfiddle.net/Freewind/PmsFQ/

+0

Proszę przejść do * innego * pytania i zamknąć je dla tego, jeśli jest to uzasadnione (to pytanie jest napisane lepiej i bardziej do rzeczy). –

+0

@pst: Gotowe. Zawsze sprawia mi to nieco nieprzyjemności, wiedząc, że w ścisłym opisie mówi się "to jest to samo co * wcześniejsze * pytania", ale myślę, że w tym przypadku wszystko jest w porządku. – BoltClock

Odpowiedz

13

Ponieważ bezpośrednie dzieci o <table> może być tylko <thead>, <tbody> lub <tfoot> (lub <colgroup> lub <caption>, ale te nie zawierają wiersze).

DOM przeglądarki domyślnie zawija zbędne <tr> s w <tbody>. (w przypadku przeglądarek, które tego nie robią, jQuery podszywa to zamiast)

Musisz napisać $('#table > tbody > tr').

+0

Drugie zdanie dotyczy zarówno HTML (jak i HTML5), ale nie XHTML. Zobacz [te] (http://stackoverflow.com/a/5568877/106224) dwie [odpowiedzi] (http://stackoverflow.com/a/7491956/106224). – BoltClock

3

Dzieje się tak, ponieważ przeglądarki automatycznie wstawiają element <tbody> między swoimi <table> i <tr>, tak, że wiersze nie są już bezpośrednimi elementami potomnymi tabeli.

2

Twoja przeglądarka dodaje element tbody, więc tr nie jest dzieckiem tabeli.

+0

Będą nadal bezpośrednimi potomkami stołu ... Po prostu nie są to jego dzieci :-) – Hubro

+0

@Codemonkey To właśnie miałem na myśli "_direct_ potomek". Ale tak, dziecko jest lepsze. –

+0

@Codemonkey: ["bezpośredni potomek" jest taki sam jak "dziecko" ...] (http://stackoverflow.com/a/3225905/106224) – BoltClock

Powiązane problemy