问题描述
我正在尝试找到一种使用jQuery查找元素的方法,但忽略那些嵌套了容器的元素。 在下面的示例中,我需要选择第二个“ findMe”,而不是第一个。 在它们之间可以有许多区域,锚点和其他容器,但是只有两个级别的区域。 最简单的示例是:
<div class="zone">
<div class="zone">
<a class="findMe"></a>
</div>
<a class="findMe"></a>
</div>
即:我正在寻找类似异或的东西:
$allZoneAnchors = $('.zone a');
$nestedAnchors = $('.zone .zone a');
//Then somehow XOR $allZoneAnchors and $nestedAnchors
jQuery .filter看起来很有趣,但是您可以使用它来
将匹配的元素集减少到与选择器匹配的元素...
当我想要的是将匹配元素('.zone a')的集合减少为与选择器不匹配的元素('.zone .zone a')时
例如:
$('.zone a').filterOutThingsThatMatch('.zone .zone a')
.not()似乎不允许我执行“没有嵌套容器的操作”要求。
1楼
只需对not中的嵌套状态进行第二次测试:
$anchors = $('.zone a').not('.zone .zone a');
字面意思是“在区域类下找到我的所有锚点,但是如果锚点在区域类下的区域类下面,则不是”。 此版本适用于任何深度,甚至区域级别之间还有其他div。
如果您知道它们的深度是固定的,则可能会更快一些:
$anchors = $('.zone > a').not('.zone > .zone > a');
2楼
如果我理解正确,则可以使用单个CSS选择器:
var $nestedAnchors = $(':not(.zone) .zone a');
你会匹配所有.zones是不是在另一个.zone
:not(.zone)是*:not(.zone)因此任何元素(但不是'.zone')
或jQuery .not()
var $('.zone a').not('.zone .zone a');
因为选择器jQuery解决方案的复杂性可能会大大提高。