理解`tr`的`children()`

时间:2016-06-29 14:37:41

标签: jquery html coffeescript

假设:

HTML

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

的CoffeeScript

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

我不明白为什么childrenWithA.length评估为0,而不是1。由于child,我期待至少有一个a<td class='a'>bar</td>

i: 0
children.length 2
childrenWithA.length 0

2 个答案:

答案 0 :(得分:1)

在CoffeeScript中,方法调用的规则是

  • 使用参数调用的方法,括号是可选的

    object.method 1,2 
    object.method(1,2)
    
  • 不带参数的方法调用必须包括括号

    object.method()
    

您在调用children时错过了括号。

一旦修复了 - coffeescript输出给出了相同的jQuery输出:https://jsfiddle.net/Lt9qfdbc/

注意:根据@ Karl-AndréGagnon的回答,您可能也需要addBack(),以便包含第一个tr元素

答案 1 :(得分:0)

这是因为.nextUntil不包含当前在堆栈中的元素(在您的情况下tr包含.a)。

如果要包含当前堆栈,则应使用.addBack

您可以在此处看到它:https://jsfiddle.net/9f3kcoq6/1/

另请注意,循环非jQuery对象或数组时应使用$.each。否则,请使用row.nextUntil('.tr').addBack().each (i) ->

至于为什么children.length评估为2,请参阅@jamiec answer

附加说明:,因为children被分配给一个函数,使用.length返回函数接受的参数个数,因此它返回2的原因。