请看这张图片:
有人可以解释一下这个区别吗?
让我指出让我感到困惑的是什么。请注意:
$row.is('tr.items:last') === false
$row[0].id === $('tr.items:last')[0].id
这两个陈述似乎相互矛盾。第一个告诉我们$row
不是tr.items
的最后一个。但第二个说明$row
正好是$('tr.items:last')
,即tr.items
的最后一个。
:last-of-type
选择器不会出现这种情况。
这里发生了什么?
答案 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以外的所有版本)。