与jQuery的相反.Closest(Top / Far-Most?)

我有一个包含许多子菜单的代码,它们共享相同的类名。

这是一个结构:

.menu .sub-menu .sub-menu .sub-menu .sub-menu .sub-menu .sub-menu .elem .elem .sub-menu 

请注意, .sub-menu可能是无限级别的深度。

那么我该如何实现这一点:当单击.elem时,我想向上.elem DOM,直到达到最顶部的.sub-menu并对其应用样式。 我知道.closest().parent().find() ,但我不知道jQuery是否有像.topMost(selector)这样的function?

我能想到的唯一方法是运行一个循环并通过新元素的.closest('.sub-menu') ,直到它的长度为零(没有更多的父级有这个类,所以它必须是顶级的-最)。 但是,我认为应该有一个更实际的方法。

假设“最接近的对面”你想要’最远’的父元素,你可以使用parents().last() ,如下所示:

 $('.elem').click(function() { var $topSubMenu = $(this).parents('.sub-menu').last(); }); 

注意,你想要数组中的最后一个元素,因为jQuery遍历DOM,所以顶级项目将是集合中的最后一个。

这个问题有点误导。 closest ()可能会被误解。 实际上它意味着搜索树直到找到第一个匹配。 所以相反的是向下搜索树,直到找到匹配并且该方法为。 first().

要查找所有后代,可以使用find() 。 与find()相反的是parents()

nearest() (所有级别) 对于集合中的每个元素,通过测试元素本身并遍历DOM树中的祖先来获取与选择器匹配的第一个元素。

first() (所有级别) 将匹配元素集减少到集合中的第一个元素

parents() (所有级别) 获取当前匹配元素集中每个元素的祖先,可选择由选择器进行过滤。

parent() (仅限下一级) 获取当前匹配元素集中每个元素的父元素,可选择通过选择器进行筛选。

find() (所有级别)获取当前匹配元素集中每个元素的后代,由选择器,jQuery对象或元素过滤。