说我有以下标记:
<div class="parent">
<div class="child">
<div class="grand-child">
我想从.parent
开始.grand-child
。我可以做以下两种情况之一:
$('.grand-child').parent().parent();
$('.grand-child').closest('.parent');
总的来说,closest()
感觉就像是一个更好的方法:
.grand-child
和.parent
具体来说,由于上面#2的优点,如果我要将我的标记更改为
<div class="parent">
<div class="child">
<div class="nanny">
<div class="grand-child">
然后我需要添加额外的parent()
,但closest()
仍可正常使用。
您有没有理由选择parent()
或closest()
?
答案 0 :(得分:4)
你应该使用$('.grand-child').closest('.parent');
,因为.parent().parent()
强烈地基于你的html结构,如果以后你在其中一个中添加另一个div,那么你将使用parent().parent()
假设您有html:
<div class="parent">
<div class="child">
<div class="grand-child-container">
<div class="grand-child">
现在如果你使用.parent().parent()
会发生什么情况,它会给你错误的元素,所以推荐的方法是使用closest()
因为它更好。
parent()获取当前匹配元素集中每个元素的父元素,可选择由选择器进行过滤。
closest()对于集合中的每个元素,通过测试元素本身并遍历DOM树中的祖先来获取与选择器匹配的第一个元素。
如果您向下滚动一下,您可以通过官方jquery网站看到这两者之间的差异。
对于这两者之间的差异,还有一些更好的答案:
Difference between jQuery parent(), parents() and closest() functions
同样表现明智closest()
优于parent()
,您可以查看Benchmark between closest() and parent()
答案 1 :(得分:3)
如果查看代码,.parent()
基本上只是DOM调用.parentNode
的包装器。它非常快速有效,因为它本质上只是对内置浏览器的一次调用。
https://github.com/jquery/jquery/blob/master/src/traversing.js#L133
.closest(selector)
确实更加安全,因为它可以保证您不会过去,或者不会过于简单地停留,并且在您到达目标父母之前停止 - 无论实际情况如何DOM的形状。但它显然也要贵得多。看一下代码:
https://github.com/jquery/jquery/blob/master/src/traversing.js#L63
它根本就是一个循环本质上更昂贵。它每次迭代都会做更多的检查。在一个非常深的DOM中,如果您例如使用.closest来询问&#34;这个标签是X的孩子吗?&#34;它将整个DOM树循环到body标签而没有其他绑定。如果您在1000个标签深处找到了1000个无意义的循环来找到它。如果你对你调用此标记的位置放置在哪里,那么就会出现同样的错误。
因此,.parent()
对于您对结构非常肯定的DOM非常有效。 .closest(selector)
适用于不太受信任的DOM,但如果你不知道DOM是什么样的话会有点危险。