【问题标题】:Jquery Traverse DOMjQuery 遍历 DOM
【发布时间】:2013-08-09 21:16:37
【问题描述】:

我有以下代码:

<p class="represent">Representing</p>
<div class="clients_wrap">
    <ul class="clients">
        <li><img src="{{ client.get_sized_image }}"></li>
    </ul>
</div>

这个块被重复了很多次。列表项的数量可能在 0 到 10+ 之间变化,但如果是 0,那么我需要隐藏它之前的 p.represent 标记——这需要独立于每个重复的代码块。

我尝试了很多方法,但无法完全弄清楚,例如

function hideEmptyClients() {
    if ( $('ul.clients li').length >= 1 ) {
        $('ul.clients').parent().closest('p').hide();
    }
}
$(function() {
    hideEmptyClients();
});

已解决: Tomalak 提供的最佳解决方案:

$(function () {
    $('ul.clients:not(:has(li))').closest(".represent_wrap").hide();
});

【问题讨论】:

    标签: jquery dom dom-traversal jquery-traversing


    【解决方案1】:

    首先,您所拥有的逻辑似乎与您所描述的相反-如果找到多个 li 元素,则隐藏 p 元素,而不是如果没有。其次,closest() 查看父元素,其中pdiv 的兄弟,因此您需要改用prev()。试试这个:

    $('.clients').each(function() {
        var $ul = $(this);
        if (!$('li', $ul).length) {
            $ul.closest('.clients_wrap').prev('p').hide();
        }
    });
    

    【讨论】:

    • 教科书——谢谢罗里。为了帮助我学习,请您解释一下这行,这有点令人困惑,尤其是与 li, ul: (!$('li', $ul).length)
    • 该行正在寻找ul 中的li 元素。 ! 反转条件,所以它实际上是说,如果ul 中的li 的数量为0,请执行以下操作....
    【解决方案2】:
    $(function() {
        $('p.represent').filter(function () {
            return $(this).next("clients_wrap").find("li").length === 0;
        }).hide();
    });
    

    这背后的基本原理遵循 jQuery 范例:

    1. 选择一些东西 ($('p.represent'))
    2. 可选择过滤它 (.filter(...))
    3. 做点什么 (.hide())

    【讨论】:

    • 感谢 Tomalak 的快速响应,我想我误会了我的目标,但 Rory 先发制人了我的意图,所以一切都已解决。珍惜你的时间。乔恩
    • @JonChubb 不确定通信错误在哪里 - 这确实完全如您所描述。引用"如果是0那么我需要隐藏p".
    • @JonChubb 下次我推荐这样的东西:jsfiddle.net/pDYMH/1
    • 哇,这是一个很棒的解决方案!
    • 刚刚用你的解决方案更新了最初的问题——干杯:)
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多