【问题标题】:Select children where not within container jquery选择不在容器jquery中的孩子
【发布时间】:2014-06-19 15:31:56
【问题描述】:

这似乎是一个简单的问题,但我在解决这个问题时遇到了一些麻烦。给出的示例是SSCCE,我有一个更大的问题试图解决。为了使它工作,查询不能包含任何直接子选择器 (>),因为 dom 树比这个例子复杂一点。

我的目标是选择所有不在包含类的父级之下的子级。在此示例中,我尝试选择 2 个 div 容器 helloworld,但不选择 foobar

这是一个 plunker,其中包含代码以方便您使用。 http://plnkr.co/edit/4zsKAFts5X7X2kLADj2V?p=preview


使用此 HTML:

<div id="root" class="parent">
  <div>
    <div class="child">hello</div>
    <div class="child">world</div>
  </div>
  <div class="parent">
    <div>
      <div class="child">foo</div>
      <div class="child">bar</div>
    </div>
  </div>
</div>

还有这个 Javascript:

var root = $('#root');
$(':not(.parent) .child', root).css('font-weight', 'bold');

我看到了这个结果:

你好

世界

条形

但我想得到的是

你好

世界

酒吧


重申一下,我想从给定节点(在本例中为 #root)开始,获取所有类为 child 且没有父类为 parent 的元素。

【问题讨论】:

  • I want to get all elements with class child who dont have a parent with class parent 根有parent 类,所以我不确定您对这项工作有何期待?
  • 我想我想将查询限制在给定的节点上,在本例中为root
  • 正如您规定的“从给定节点开始”,您应该使用将根节点作为参数而不使用硬连线选择器常量的版本,例如:var root = $('#root'); $('.child', root).not(root.find(".parent .child")).css('font-weight', 'bold'); 或 @987654337 @
  • @TrueBlueAussie 好吧,这只是我为了说明我遇到的问题而编造的一个小例子,我的实际代码看起来不像这样。

标签: javascript jquery jquery-selectors


【解决方案1】:
var root = $('#root');
$('.child',  root).not($("#root .parent .child")).css('font-weight', 'bold');

jsFiddle example

【讨论】:

  • 你为什么要在.not()里面制作jQuery对象?无论如何,可能是最好的解决方案。 +1
  • @Karl-AndréGagnon - 我猜是懒惰的 ;) 无论如何,你也可以这样做 .not($(".parent .child",root))
  • 酷。适用于我遇到的任何情况:)
  • 我建议稍微改变一下,这样根选择器就不会被引用两次,因为这不像引用 root var 那样便携(见下文)。
【解决方案2】:

它可能不漂亮,但给你:

$('#root').find('.child').filter(function(){
    if($(this).parents('.parent').first().attr('id') === 'root'){
        return 1;
    }
    else{
        return 0;
    }
}).css('font-weight', 'bold');

http://jsfiddle.net/PDZL8/

【讨论】:

  • @TrueBlueAussie idk 支持我,但我的测试表明你是对的。我正在研究一个可行的解决方案大声笑
  • @TrueBlueAussie 固定 =)
  • .closest() 而不是.parents.first() 的组合呢? :)
  • 你不需要if/else
  • @TrueBlueAussie 为什么它不起作用?请修改我的小提琴来说明
【解决方案3】:

JSFiddle:http://jsfiddle.net/TrueBlueAussie/78G6N/3/

var root = $('#root');
$('#root').find('.child').filter(function(){
    return $(this).closest('.parent').is(root);
}).css('font-weight', 'bold');

我还改进了 j08691 的解决方案,使其使用提供的根节点,而不是复制选择器(不可移植):

http://jsfiddle.net/TrueBlueAussie/78G6N/4/

var root = $('#root');
$('.child',  root).not(root.find(".parent .child")).css('font-weight', 'bold');

【讨论】:

  • 稍微优化一下,你可以用is(root)代替not + length + bang。
  • @Karl-André Gagnon:啊……我在那个版本中有错字。谢谢。更新到您的建议:)
【解决方案4】:

你可以用这个:

$('#root').find('.child').filter(function(){
    return $(this).parents('.parent').length <= 1;
}).css('font-weight', 'bold');

它检查 div 的父级数量,如果小于或等于 1,则返回子级。

小提琴:http://jsfiddle.net/akwPb/

【讨论】:

  • @TrueBlueAussie 我真的不明白你的意思。 .parents() 只会选择 parent 类的元素,所以如果有更多的 div 也没关系。
  • 如果你在当前结构之上添加一个 .parent 将会失败:jsfiddle.net/TrueBlueAussie/akwPb/1
【解决方案5】:
    $("#root .child:not(#root .parent * .child)")
    .css("font-weight", "bold")

jsfiddle http://jsfiddle.net/guest271314/UJJXU/

【讨论】:

  • “从给定节点开始”意味着#root 不应是硬连线选择器字符串,而应用作参数。
  • @TrueBlueAussie 不都是 jQuery 选择器,本质上是“选择器字符串”吗?上面不是“开始”#root“节点”$("#root .child . .吗?不完全确定上述文章与发布的其他答案有何不同,除了省略 .find().filter() 。请照亮。谢谢
猜你喜欢
  • 2012-12-13
  • 2012-05-22
  • 2013-04-23
  • 2011-02-23
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2011-06-23
  • 2014-12-25
相关资源
最近更新 更多