【问题标题】:How to select only the first level children in JQuery [closed]如何在 JQuery 中仅选择第一级子级 [关闭]
【发布时间】:2013-06-28 17:31:12
【问题描述】:

我的 DOM 中有以下结构,我想只从指定的类中选择第一级子级。如何在 JQuery 中做到这一点?

请注意,我嵌套了具有相同 css 类的 div。

我的 HTML:

<div class="t">
    <div>title</div>
    <div class="ch">
        <input type="text name="input1" value="" id="i1">
    </div>
    <div class="t">
        <div>sub title</div>
        <div class="ch">
            <input type="text name="input2" value="" id="i2">
        </div>
    </div>
</div>

我需要得到什么: 当我找到所有具有类 't' 的元素并进行迭代时,我想获取具有类 'ch' 的子元素(而不是内部 div 中的类 't' 的子元素)。

Javascript

$(".t").each(function() {
    //Get the elements in '.ch' for $(this) and process.
});

感谢您的帮助。

【问题讨论】:

  • 第一级表示不嵌套在其他子元素下。你的意思是,还是只有出现的第一个?
  • 你真的需要停下来,弄清楚你需要什么,并更新你的问题以清楚地解释它。我不知道在获取.ch 元素时是否应该包含嵌套的.t 元素。
  • @M99 是你想要的吗? jsfiddle.net/c68xR/2 选择每个 .t 和顶级 lvl .ch?
  • ...你知道,如果你很难表达应该选择哪些节点,你可以使用一些 HTML cmets 来注释你的目标。
  • 我不知道 JSON 在这一切中的作用。你是说你正在创建一个由.ch 元素的一些属性组成的 JSON 结构(一个字符串)?

标签: javascript jquery


【解决方案1】:

你可以使用children选择器

类似

$('.t').children('.ch')

这相当于

$('.t > .ch') // Child selector

,您可以从代码中删除each循环,因为选择器选择您要查找的元素。

编辑

对于第一级,您可以使用child selectorparents 方法的组合

$('.t > .ch').filter(function() {
   return $(this).parents('.t').length === 1 
})

Check Fiddle

【讨论】:

  • 您能否详细说明为什么使用children() 方法会更好? .t &gt; .ch 绝对不会被弃用,它是一个有效的 CSS 选择器,可以提供给 querySelectorAll(),这通常更快。
  • 这实际上并没有按照 OP 指定的方式使用每种方式
  • @Sushanth-- 我确认子选择器更快:jsperf.com/child-selector-vs-children23
  • 我只想要一级孩子。不是所有的孩子。例如:如果您使用类“t”的第一个 div,我只想要第一个“ch”中的元素。
  • 这个答案不正确。它将匹配外部和内部元素。 OP 声明只匹配外部元素。
【解决方案2】:

如果你想要顶级.t,你可以使用这个:

$('.t').not('.t > .t').children('.ch')

然后,一旦您获得了所需的每个 .ch,您就可以遍历它们。

如果你想遍历.t,那么你可以让孩子进入循环:

$('.t').not('.t > .t').each(function(){
    var ch = $(this).children('.ch')
})

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


如果您想选择第一个 lvl .t 的每个.t 和每个.ch,这就是您想要的:

$('.t').each(function(){
    var $this = $(this);
    $this.css('border', 'red 1px solid');
    if(!$this.is('.t > .t')){
        $this.children('.ch').css('border', 'blue 1px solid');
    }
})

小提琴:http://jsfiddle.net/c68xR/2/

【讨论】:

  • 看起来您比我们其他人更了解提问者的目标。干得好:)
  • @FrédéricHamidi,不得不承认,这很难 :) 谢谢!
【解决方案3】:

在这里玩猜谜游戏,但这是您要找的吗?

$(".t").each(function(i) {
   var childrenCHOnly = $(this).children('.ch');
   /* Do work to childrenCHOnly */
});

jsFiddle


或者这个:

 $(".t").filter(function(i) { return $(this).find('.t').length; }).children('.ch').first();

它将过滤以仅获取具有.t 内部元素的.t 元素,然后获取第一个子元素.ch

jsFiddle


当然你也可以说:

$(".t").first().children(".ch").first().each(function(i) { ...

|或|

$(".t > .ch").first().each(function(i) { ...

当然,这两个都只会抓取第一个 .t,不管它是否是 more 的父母

【讨论】:

  • +1 但我认为 OP 想要顶级 .t,这并不一定意味着有嵌套的 .t 元素。这个问题并不完全清楚。使用$(this).closest(".t").length === 0 可能更安全,以便排除具有.t 祖先的那些。
  • @CrazyTrain 太真实了,这就是为什么我一直在进行一些更新,但很难确切地说出她/他想要什么?
  • 同意。如果可以保证始终存在嵌套,那么您的第一个解决方案将完美运行。
  • 我想读取每个带有 't' 类的 div 并创建 JSON,并将其下的元素作为层次结构(更像是一棵树)。您在 Divs 中看到的嵌套也将在 JSON 中。谢谢。
  • @M99 好的,你看到我的最新更新了吗,我添加了一个新示例,也许合适?
【解决方案4】:
$(".t").children(".ch").each(function() {
  // do stuff here
});

如果你想定位 .ch 元素内的元素,你可以这样做:

$(".t").children(".ch").children().each(function() {
  // do stuff here
});

【讨论】:

  • 这实际上不是 OP 使用每个的方式
【解决方案5】:

假设您真的想遍历每个 .t 元素,并独立地找到 每个 的孩子 - 其他答案似乎错过了 - 我认为这就是你想要的:

$(".t").each(function() {
    var childen = $(this).children('.ch');
});

对于原始问题中给出的示例 HTML,我们将循环遍历 each 2 次 - 每个 .t 元素一次。第一次通过,只会选择第一个.ch元素,第二次通过,只会选择第二个.ch元素。

children()find() 的不同之处在于它只查找被调用元素的直接(第一级)子元素 - 在本例中为 $(this),即在电流通过回路。

【讨论】:

  • 你正确理解了这个问题,但是 $(this).children('.ch') 将给所有的孩子(即使是嵌套 div 下的那些 clss 't')。
  • @M99:是哪一个...他正确理解了这个问题,或者您不希望嵌套.t元素中的.ch元素?
  • @m99 不,children() 只获得直系子级。所以当each 位于第一个.t 时,它只会得到第一个.ch。当each 得到第二个.t 时,它会得到第二个.ch,因为它是.t 的一级子级。
  • 好吧,我在这里给 +1 这个和所有其他答案。如果有人发布了一个用 Clojure 编写的斐波那契函数,我可能也会赞成。
猜你喜欢
  • 2016-03-16
  • 2021-08-24
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2011-03-01
  • 2010-11-09
  • 1970-01-01
  • 2021-07-05
相关资源
最近更新 更多