2016-06-29 16 views
0

Gegeben:Verständnis `Kinder()` `von tr`

HTML

<table> 
    <tr> 
    <td class='foo'>foo</td> 
    <td class='a'>bar</td> 
    </tr> 
    <tr class='here'></tr> 
</table> 

Coffee

row = $('.foo').closest('tr') 
$.each row.nextUntil('.tr'), (i) -> 
    console.log 'i:', i 
    children  = $(this).children 
    childrenWithA = $(this).children('.a') 
    console.log 'children.length', children.length 
    console.log 'childrenWithA.length', childrenWithA.length 

Ich verstehe nicht, warum childrenWithA.length-0 auswertet, nicht 1. Ich erwartete mindestens eine einzige child mit Klasse = a aufgrund <td class='a'>bar</td>.

i: 0 
children.length 2 
childrenWithA.length 0 
+0

Ich folge nicht, was die 'nextUntil (". Tr ")' dreht. Wenn Sie 'nextUntil (". Tr ")' verwenden, springt Ihr Code über den ersten 'tr' (mit dem' .a' Kind) und beginnt stattdessen mit dem folgenden 'tr' ohne. – Jamiec

+0

Ich benutze 'nextUntil', um' '' s von '' zu modifizieren, bis eine '' eine bestimmte Klasse hat. –

+1

OK, aber die äquivalente jQuery gibt nicht die gleiche Ausgabe wie Sie beschreiben: https://jsfiddle.net/9c8zevdo/ – Jamiec

Antwort

0

Das liegt daran, dass die .nextUntil nicht das Element umfasst zur Zeit in dem Stapel (in Ihrem Fall tr mit .a).

Wenn Sie den aktuellen Stapel hinzufügen möchten, sollten Sie .addBack verwenden.

Sie können es sehen, hier zu arbeiten: https://jsfiddle.net/9f3kcoq6/1/

Beachten Sie auch, dass $.each verwendet werden soll, wenn Sie Schleife eines nicht-jQuery-Objekt oder ein Array. Andernfalls verwenden Sie row.nextUntil('.tr').addBack().each (i) ->.


Was, warum children.length bewerten als 2 finden @jamiec answer.

Zusätzlicher Hinweis darauf: seit children einer Funktion zugeordnet ist, .length Rückkehr die Anzahl der Argumente verwenden, die akzeptieren funktionieren, also warum die Regeln für Methodenaufrufe 2.

+0

_Das ist, weil die .nextUntil das Element derzeit nicht enthält. .._ Das ist richtig, aber erklärt nicht die Ausgabe '0, 2, 0', die '0, 0, 0' sein sollte, wenn es überhaupt keine Kinder gibt. – Andreas

+0

@Andreas Jamiec erklärte es, aber ich fügte eine Notiz hinzu erkläre es ein wenig. –

1

In Coffee zurückgeben sind

  • Methoden mit Parametern aufgerufen, sind Klammern optional

    object.method 1,2 
    object.method(1,2) 
    
  • Methodenaufrufe ohne Parameter müssen umfassen die Klammern

    object.method() 
    

Sie Klammern aus dem Aufruf von children fehlt.

Sobald dies festgelegt ist - der Coffee Ausgang dre gleiche gibt, ist die damit verbundene jQuery nur Ausgabe: https://jsfiddle.net/Lt9qfdbc/

Hinweis: Sie möchten möglicherweise addBack() auch per @ Karl-André Gagnon Antwort, um den ersten gehören tr Element