假设:
<table>
<tr>
<td class='foo'>foo</td>
<td class='a'>bar</td>
</tr>
<tr class='here'></tr>
</table>
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
答案 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的原因。