【问题标题】:css selector to exclude certain descendants and their descendants of jquery object?css 选择器排除 jquery 对象的某些后代及其后代?
【发布时间】:2023-03-10 14:50:01
【问题描述】:

给定一个具有多个后代级别的 jquery 对象,您如何排除某些后代及其后代?假设在要排除的元素的顶部节点上有一个类(在这种情况下为.foo),并且您的 jquery 对象是下面的div1

编辑:澄清:我想排除 .foo 的所有后代,而不仅仅是直系子女。

$('#button1').click(function() {
  var selector = '#test ' + $('#input1').val();
  var numberElements = $(selector).length;
  $('#numberElements').text(numberElements);
  var elementsAsCommaSeparatedList = _.pluck($(selector), 'id');
  $('#elementList').text(elementsAsCommaSeparatedList.join(', '));
});
#input1 {
  width: 230px;
  font-size: 16px;
  font-weight: bold;
}

#numberElements,
#elementList {
  color: green;
  font-weight: bold;
  font-size: 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<label for="input1">Please supply a selector... $('<input id="input1" value="div:not(.foo, .foo *)"></label>')
<button id="button1">Apply Selector</button>
<div>(default value is from @DaniP's answer)</div>
<div id="result"><span>Number of elements selected:  </span><span id="numberElements">0</span></div>
<div>
  <span>Elements selected (by id):</span>
  <span id="elementList"></span>
</div>
<div id="test">
  <div id="div1">
    <div id="div2">
      <div id="div4">
        <div id="div8"></div>
        <div id="div9"></div>
      </div>
      <div id="div5" class="foo">
        <div id="div10"></div>
        <div id="div11"></div>
      </div>
    </div>
    <div id="div3">
      <div id="div6">
        <div id="div12"></div>
        <div id="div13"></div>
      </div>
      <div id="div7" class="foo">
        <div id="div14"></div>
        <div id="div15"></div>
      </div>
    </div>
  </div>
</div>

【问题讨论】:

    标签: javascript jquery jquery-selectors


    【解决方案1】:

    jQuery

    使用 Jquery,您可以在 :not 选择器上使用多个参数,这样可以轻松排除 .foo 和子元素:

    $('div:not(.foo, .foo *)')
    

    示例片段

    $('div:not(.foo, .foo *)').css('border-color','blue')
    div {
      padding-left:20px;
      margin:5px;
      border:thin red solid;
    }
    .foo {
      background:rgba(0,0,0,.1)
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div>
    DIV1
      <div>
      DIV2
        <div>
        DIV4
          <div>DIV8</div>
          <div>DIV9</div>
        </div>
        <div class="foo">
        DIV5
          <div>DIV10</div>
          <div>DIV11</div>
        </div>
      </div>
      <div>
      DIV3
        <div>
        DIV6
          <div>DIV12</div>
          <div>DIV13</div>
        </div>
        <div class="foo">
        DIV7
          <div>DIV14</div>
          <div>DIV15</div>
        </div>
      </div>
    </div>

    但 CSS 不允许这样做,refer to this answer


    CSS

    在 CSS 上,您需要定位不是 .foo 的所有 div,但还要再次覆盖 .foo 的子元素:

    div:not(.foo) {
      border-color:blue;
    }
    div.foo * {
      border-color:red;
    }
    

    示例片段

    div {
      padding-left:20px;
      margin:5px;
      border:thin red solid;
    }
    .foo {
      background:rgba(0,0,0,.1)
    }
    div:not(.foo) {
      border-color:blue;
    }
    div.foo * {
      border-color:red;
    }
    <div>
    DIV1
      <div>
      DIV2
        <div>
        DIV4
          <div>DIV8</div>
          <div>DIV9</div>
        </div>
        <div class="foo">
        DIV5
          <div>DIV10</div>
          <div>DIV11</div>
        </div>
      </div>
      <div>
      DIV3
        <div>
        DIV6
          <div>DIV12</div>
          <div>DIV13</div>
        </div>
        <div class="foo">
        DIV7
          <div>DIV14</div>
          <div>DIV15</div>
        </div>
      </div>
    </div>

    【讨论】:

    • 不错的答案。我应该使用其他一些标签,但我想你会以 * 而不是 div 开头。
    • 是的@johntrepreneur 或者只是没有标签的类名
    【解决方案2】:

    也许使用 :not 选择器?

    类似

    div:not(.foo)
    

    【讨论】:

    • :not 选择器仅排除该级别而不排除 :not() 的后代。
    • div:not(.foo) > div { style here }
    • &gt; 仅适用于直系子女。我想要所有的后代,而不仅仅是直系子女。
    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多