jQuery过滤选择器,用于删除与模式匹配的嵌套元素

前端之家收集整理的这篇文章主要介绍了jQuery过滤选择器,用于删除与模式匹配的嵌套元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给定此示例标记(假设.outer和.inner之间的随机数量的元素:
<div class="outer">
    <div>
        <div>
            <div class="inner"></div>
        </div>
    </div>
</div>
@H_502_4@我可以设置jQuery来选择外部和内部div这样:

$outer = $('.outer');
$inner = $outer.find('.inner')
@H_502_4@工作良好.

@H_502_4@但是,假设我想允许无限制地嵌套这个逻辑,所以我可能会这样:

<div class="outer"> div a
    <div class="inner"> div b
        <div class="outer"> div c
            <div class="inner"> div d </div>
        </div>
    </div>
</div>
@H_502_4@在那种情况下,当选择div a via .outer时我想将它与div b匹配.换句话说,我想排除嵌套.outer祖先的祖先.

@H_502_4@我想在它们的嵌套级别中包含外部和内部的parings.

@H_502_4@我希望.filter()可以把它拉下来,但是不能想到一个选择器,它可以普遍用于无限制的嵌套模式.是否可以使用过滤器?或者甚至可能是直接选择器模式?

@H_502_4@更新:

@H_502_4@我认为这样的事情可以起作用,但不确定如何(或者如果允许的话)在选择器中引用“this”:

$outer = $('.outer');
$inner = $outer.not('this .outer').find('.inner')
@H_502_4@更新2:

@H_502_4@我本应该提到这一点:.inner将永远是.outer的后代,但不一定是直接的孩子.

@H_502_4@更新3:

@H_502_4@这是一些可以使用的HTML测试样本.在每种情况下,我都希望能够选择.outer并将它本身和嵌套外部之间包含的.inner配对.为清楚起见,我为每个div添加名称(带有inner-x的外部x对)

//sample 1
<div class="outer"> outer-a
    <div>
        <div class="inner"> inner-a
            <div class="outer"> inner-b
                <div class="inner"> inner-b </div>
            </div>
        </div>
    </div>
    <div>
        <div class="inner"> inner-a </div>
    </div>
</div>

//sample 2
<div class="outer"> outer-a
        <div class="inner"> inner-a
            <div class="outer"> inner-b
                <div>
                    <div class="inner"> inner-b </div>
                </div>
            </div>
        </div>
</div>

//sample 3
<div class="outer"> outer-a
        <div class="inner"> inner-a
            <div class="outer"> inner-b
                <div class="inner"> inner-b
                    <div class="outer"> outer-c 
                        <div class="inner"> inner-c</div>
                    </div>
                </div>
            </div>
        </div>
</div>

//bonus sample (we're trying to avoid this)
<div class="outer"> outer-a
        <div class="inner outer"> inner-a outer-b
            <div class="inner"> inner-b </div>
        </div>
</div>
@H_502_4@更新4

@H_502_4@我想我最终走上了与gnarf类似的道路.我最终得到了这个:

var $outer = $('.outer');
var $inner = $outer.find('.inner').filter(function(){
    $(this).each(function(){
        return $(this).closest('.outer') == $outer; 
  });                                                                  
});
@H_502_4@我在正确的轨道上吗?它没有用,所以我假设我还有一点逻辑错误.

解决方法

@H_403_47@ 这是另一种选择.假设您有.outer o,这将选择其下的所有内容
o.find('.inner').not(o.find('.outer .inner'))
@H_502_4@它应该与gnarf的答案完全相同,但有点简单.

@H_502_4@首先,它找到了这个外部的所有内在者.
接下来,删除所有作为其他outers后代的内部

@H_502_4@交互式工作示例:http://jsfiddle.net/Zb9gF/

@H_502_4@使用此方法,与.filter()相比,选择器性能似乎要好得多:http://jsperf.com/selector-test-find-not

猜你在找的jQuery相关文章