【问题标题】:How to iterate through each parent list items in jquery?如何遍历jquery中的每个父列表项?
【发布时间】:2016-09-17 00:15:42
【问题描述】:

我刚开始使用 jQuery,在遍历每个父 UL 的列表项时遇到了一些麻烦。

我有一个简单的手风琴菜单,我正在向每个单独的列表项添加转换延迟内联样式。我遇到的问题是我不确定如何遍历每组父列表项。

以下是每个列表项上发生的情况的示例。

<ul class="sub-menu">
    <li style="transition-delay: 0ms;></li>
    <li style="transition-delay: 25ms;>
        <ul class="sub-menu">
            <li style="transition-delay: 50ms;>
            <li style="transition-delay: 75ms;>
            <li style="transition-delay: 100ms;>
        </ul>
    </li>
    <li style="transition-delay: 125ms;></li>
    <li style="transition-delay: 150ms;></li>
    <li style="transition-delay: 175ms;></li>
</ul>

这就是我想要实现的目标:

<ul class="sub-menu">
    <li style="transition-delay: 0ms;></li>
    <li style="transition-delay: 25ms;>
        <ul class="sub-menu">
            <li style="transition-delay: 0ms;>
            <li style="transition-delay: 25ms;>
            <li style="transition-delay: 50ms;>
        </ul>
    </li>
    <li style="transition-delay: 50ms;></li>
    <li style="transition-delay: 75ms;></li>
    <li style="transition-delay: 100ms;></li>
</ul>

这就是我的 jQuery 的样子:

$('ul.mobile-menu li.menu-item-has-children ul.sub-menu li').each(function(i){
    $(this).css({ 'transition-delay': (i*25)+"ms" });
});

任何帮助将不胜感激,因为我刚刚开始使用 jQuery。我创建了一个 codepen,因此您可以看到正在运行的菜单并直观地看到问题。

http://codepen.io/creativenauts/pen/wGLqPg

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您可以使用.index(),它给出了一个元素在其兄弟元素中的位置:

    $('ul.mobile-menu li.menu-item-has-children ul.sub-menu li').each(function(){
        $(this).css({ 'transition-delay': ($(this).index()*25)+"ms" });
    });
    

    【讨论】:

    • 因为.index() 在其父子节点中返回其索引,这使得它可以根据需要重置为零。
    【解决方案2】:

    像这样:

    $('ul.mobile-menu li.menu-item-has-children ul.sub-menu').each(function(j, subMenu){
        $(subMenu).children('li').each(function(i, li){ 
            $(li).css('transition-delay', (i*25)+'ms') 
        })
    });
    

    【讨论】:

    • 这样就行了。当您使用 function(i,li) 时,它是如何工作的?我看到你在使用 $(li).css - 你能解释一下这个过程,以便我能更好地理解它吗?再次感谢!
    • 我想我现在明白了。因此,不是在 LI 上为 each 做,而是在子菜单上做,然后在子菜单的子 LI 上为 each 做另一个。现在对我有意义。
    • $('ul.mobile-menu li.menu-item-has-children ul.sub-menu li').css('transition-delay', function(i) { return (i * 25) + 'ms'; });
    • 实际上,不,我的最后一条评论使i 在所有迭代中增加。
    • 这只是函数参数:索引和特定的li节点。诀窍是在那之前的部分。我不会一次选择所有LI,而是UL by UL
    【解决方案3】:

    这是我的方法:

    $('.sub-menu').each(function() {
      // $(this) = single ul element
      $(this).children('li').each(function(idx, el){
        // idx = index of current list [0 ... number]
        // $(el) = single li element
        $(el).css('transition-delay', (idx * 25) + 'ms');
      });
    });
    

    但在这个用例中(w.r.t. 列表的大小)您可以而且应该使用 CSS,something like this

    【讨论】:

    • 谢谢,我很快就会在这里试一下css方法。理想情况下,我看不到超过 10 个项目的列表项,这似乎是一种不使用 javascript 的更简洁的方法。感谢您的帖子!
    • 另外更改 DOM(使用 javascript)会阻塞渲染过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2011-05-29
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多