另一个最接近的子线程:查找与选择器匹配的元素的最近祖先
Yet another closest child thread: finding the nearest ancestor of an element that matches a selector
下面是一个HTML模块的大纲:
.module
.module-title
.module-foo
.module-bar
.module-children
模块可以相互嵌套:
.module
.module-title
.module-foo
.module-bar
.module-children
.module
.module-title
.module-foo
.module-bar
.module-children
.module
.module-title
.module-foo
.module-bar
.module-children
.module
.module-title
.module-foo
.module-bar
.module-children
.module
.module-title
.module-foo
.module-bar
.module-children
我将最顶层的.module
存储在 jQuery 对象$module
中。
现在,我想选择属于最顶层模块.module-bar
,不包括属于嵌套模块的模块。
问题是我不想对层次结构进行硬编码。
例如,我可以这样做:
$bar = $module.find('> .module-foo > .module-bar');
或者这个:
$bar = $module.find('.module-bar').eq(0);
但是模块内容的结构可能会有细微的变化。子元素可能以不同的顺序显示,或者以不同的方式嵌套。这些 HTML 更改中的任何一个都会破坏 JS 代码,我希望代码是敏捷的,并且能够容忍 HTML 结构的微小更改。
相反,我想做这样的事情:
$bar = $module.closestChild('.module-bar');
我发现了许多问题和解决方案,都可以被描述为"反向closest()
"。这里有一个例子:https://github.com/jstnjns/jquery-nearest/但它不适合我,因为它只会阻止在目标实例内遍历。在我的情况下,目标元素不包含嵌套模块,因此nearest()
会选择.module-bar
的所有实例。
其他解决方案只是没有通过要求。例如,此 https://stackoverflow.com/a/7051985/901944 依赖于 .first()
.
你可以过滤父母
var $bars = $module.find('.module-bar').filter(function() {
return $(this).closest('.module').get(0) === $module.get(0);
});
这排除了任何.module-bar
嵌套的 depper 而不是一个.module
小提琴
或者(内部与上述相同,因此可能不会更有效率(
var $bars = $module.find('.module-bar').not('.module .module .module-bar');
小提琴
所以我做了一个小的jQuery插件jquery.closestchild,它一步一步地遍历树,一旦找到匹配项就不会再进一步了。
插件:https://github.com/lolmaus/jquery.closestchild/
演示:http://lolmaus.github.io/jquery.closestchild/
以下是针对 adeneo 解决方案的性能测试:http://jsperf.com/closestchild#runner 。该插件的执行速度提高了八倍,并且差异应与 DOM 树深度成比例增长。
$module.find(':not(.module .module .module-bar)').filter('.module-bar')
但我假设.module-bar
将在主要.module
下,而.modules
的孩子将在主要.module
下。
http://jsfiddle.net/zsQnH/2/
- 选择一个元素,使其最近的具有特殊属性的父元素具有特殊值
- 找到具有绝对位置的最近元素
- 如何获取特定类中最近的元素
- 找到最近的span元素并更改CSS类
- jQuery .load 在最近的跨度而不是元素本身
- 使用 z 索引确定最近的元素
- 选择最近的(选择器)元素
- 查找所选元素的最近链接
- 如何查找最近的元素
- 在没有 jQuery 的情况下查找最近的元素
- Jquery 选择元素下一个/上一个/最近
- 关于使用类名定位第一个上一个最近元素的问题
- 隐藏最近的元素
- jQuery.最近未找到正确的p元素
- 使用多个选择器查找DOM中最近的元素
- 如何使用javascript从最近的li元素向pre-tag添加id
- 使用javascript查找元素相对于最近相对定位的父元素的位置
- 若最近的元素包含字符串,则将类添加到元素中
- 在元素中查找最近的td
- 当元素被单击时,用另一个类找到相对于该元素最近的元素并切换它