有什么区别:jQuery中的last和:last-of-type?

时间:2012-09-01 14:36:57

标签: jquery

请看这张图片:

enter image description here

有人可以解释一下这个区别吗?

修改

让我指出让我感到困惑的是什么。请注意:

  1. $row.is('tr.items:last') === false
  2. $row[0].id === $('tr.items:last')[0].id
  3. 这两个陈述似乎相互矛盾。第一个告诉我们$row不是tr.items的最后一个。但第二个说明$row正好是$('tr.items:last'),即tr.items的最后一个。

    :last-of-type选择器不会出现这种情况。

    这里发生了什么?

3 个答案:

答案 0 :(得分:5)

last-of-type是一个 CSS 伪类,它代表给定标记名称的最后一个兄弟。 可能作为jQuery选择器工作,如果浏览器支持querySelectorAll()并且您不使用仅jQuery选择器;否则,它将使用Sizzle,它不支持它。请参阅this jQuery ticket。

另一方面,:last jQuery 选择器,它选择最后匹配的元素。

答案 1 :(得分:1)

jQuery在设置.is等过滤器时为:last执行了不同的过滤机制。关键是它通常在当前集合上使用.filter并检查过滤后是否还有任何元素。

适用于以下情况:

$("<a></a><b></b>").is("b");  // true, there is a <b> after filtering

但是对于:last,这会失败,因为这样的过滤器是相对于集合的。考虑一个包含两个元素的文档:

$("a:first").is("a:last");  // would be true if the same method was used,
                            // because in the set with the first <a> element,
                            // the last <a> element is that element. So filtering
                            // with `a:last` yields something, and `.is` gets you
                            // true.

这与您的预期形成鲜明对比。因此,jQuery会在当前上下文中搜索a:last,并检查该集合中a:first是否明显。

您的案例中的问题是$(ev.target)(在handleKeyDown中)使上下文成为输入元素而不是文档(这是通常的情况)。在该上下文中找不到tr.items,您获得false。这可以说是jQuery中的一个错误。

无论如何,你可以做的就是检查一组。无论如何,使用相应的功能更快:

$row.is( $("tr.items").last() );  // true

答案 2 :(得分:0)

:last-of-type选择具有指定标记名称的最后一个兄弟。请注意:last-of-type不是“官方”jQuery选择器,只适用于某些浏览器 - 特别是支持document.querySelectorAll()的浏览器(IE以外的所有版本)。