问题描述
我正在尝试找到一种使用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解决方案的复杂性可能会大大提高。