通过 jquery 获取 class 的普遍最接近的元素
Get universally closest element of a class via jquery
在我的代码中,一个按钮应该允许用户隐藏附近的 div。
为了让事情变得抽象,每当一个按钮有一个 data-collapse="true" 属性时,jQuery 应该寻找最接近 class "collapsable" 的元素并隐藏它。问题是,在我的页面中,会有不同的层次结构,所以 .closest() 并不总是有效。让我指出一些可能的情况:
第一种情况:
<a data-collapse="true"></a>
<div class="collapsable"></div>
第二种情况:
<div class"controls">
<a ...></a>
<a ...></a>
<a data-collapse="true"></a>
</div>
<div class="collapsable"></div>
第三种情况:
<div class="collapsable">
...
<a data-collapse="true"></a>
</div>
可能还有更多病例。
我的问题:是否有一种通用方法可以调用 a 按钮来查找 class "collapsable" 中最近的 div 而不管要查找哪个方向?比如,在两个方向上缩小直到找到匹配项?
您的问题:
有没有一种通用的方法可以调用a-button来寻找最近的div of class "collapsable" 而不管寻找哪个方向?
总之我会回答:没有!没有。
但是您可以像这样检查元素,这可能会有所帮助:
var $collapsable = $('a[data-collapse="true"]').next('.collapsable') ||
$('a[data-collapse="true"]').prev('.collapsable') ||
$('a[data-collapse="true"]').parent().next('.collapsable') ||
$('a[data-collapse="true"]').parent().prev('.collapsable') ||
$('a[data-collapse="true"]').parent().find('.collapsable') ||
$('a[data-collapse="true"]').closest('.collapsable');
这是我的想法:在被点击元素的父元素中进行递归搜索。
我已经用大量嵌套和分离的示例说明了代码,运行 下面。
$("a[data-collapse=true]").click(function() {
var $elem, $searchIn, max, result;
$searchIn = $(this);
$elem = null;
result = null;
max = 50; // Max recursiveness
while (($elem === null) && max) {
result = $searchIn.find('.collapsable');
if (result.length) {
$elem = result.first();
}
$searchIn = $searchIn.parent();
max--;
}
$elem.css("border", "red dashed 2px");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div><a href="#" data-collapse="true">Click me</a>
<div class="collapsable">I should get red</div>
</div><br/><br/>
<div>
<div>
<a href="#" data-collapse="true">Click me</a>
</div>
<div>
<div class="collapsable">I should get red</div>
</div>
</div><br/><br/>
<div>
<div>
<div>
<a href="#" data-collapse="true">Click me</a>
<div>
<div>
<div>
<div class="collapsable">I should get red</div>
</div>
</div>
</div>
</div>
</div>
</div><br/><br/>
<div>
<div>
<div>
<div>
<div>
<div><a href="#" data-collapse="true">Click me</a></div>
</div>
</div>
</div>
<div>
<div>
<div>
<div>
<div>
<div class="collapsable">I should get red</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
在我的代码中,一个按钮应该允许用户隐藏附近的 div。 为了让事情变得抽象,每当一个按钮有一个 data-collapse="true" 属性时,jQuery 应该寻找最接近 class "collapsable" 的元素并隐藏它。问题是,在我的页面中,会有不同的层次结构,所以 .closest() 并不总是有效。让我指出一些可能的情况:
第一种情况:
<a data-collapse="true"></a>
<div class="collapsable"></div>
第二种情况:
<div class"controls">
<a ...></a>
<a ...></a>
<a data-collapse="true"></a>
</div>
<div class="collapsable"></div>
第三种情况:
<div class="collapsable">
...
<a data-collapse="true"></a>
</div>
可能还有更多病例。
我的问题:是否有一种通用方法可以调用 a 按钮来查找 class "collapsable" 中最近的 div 而不管要查找哪个方向?比如,在两个方向上缩小直到找到匹配项?
您的问题:
有没有一种通用的方法可以调用a-button来寻找最近的div of class "collapsable" 而不管寻找哪个方向?
总之我会回答:没有!没有。
但是您可以像这样检查元素,这可能会有所帮助:
var $collapsable = $('a[data-collapse="true"]').next('.collapsable') ||
$('a[data-collapse="true"]').prev('.collapsable') ||
$('a[data-collapse="true"]').parent().next('.collapsable') ||
$('a[data-collapse="true"]').parent().prev('.collapsable') ||
$('a[data-collapse="true"]').parent().find('.collapsable') ||
$('a[data-collapse="true"]').closest('.collapsable');
这是我的想法:在被点击元素的父元素中进行递归搜索。
我已经用大量嵌套和分离的示例说明了代码,运行 下面。
$("a[data-collapse=true]").click(function() {
var $elem, $searchIn, max, result;
$searchIn = $(this);
$elem = null;
result = null;
max = 50; // Max recursiveness
while (($elem === null) && max) {
result = $searchIn.find('.collapsable');
if (result.length) {
$elem = result.first();
}
$searchIn = $searchIn.parent();
max--;
}
$elem.css("border", "red dashed 2px");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div><a href="#" data-collapse="true">Click me</a>
<div class="collapsable">I should get red</div>
</div><br/><br/>
<div>
<div>
<a href="#" data-collapse="true">Click me</a>
</div>
<div>
<div class="collapsable">I should get red</div>
</div>
</div><br/><br/>
<div>
<div>
<div>
<a href="#" data-collapse="true">Click me</a>
<div>
<div>
<div>
<div class="collapsable">I should get red</div>
</div>
</div>
</div>
</div>
</div>
</div><br/><br/>
<div>
<div>
<div>
<div>
<div>
<div><a href="#" data-collapse="true">Click me</a></div>
</div>
</div>
</div>
<div>
<div>
<div>
<div>
<div>
<div class="collapsable">I should get red</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>