0

次のコードがあります。

<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();
});
4

2 に答える 2

0

まず、あなたが持っているロジックは、あなたが説明したものとは逆のようです-要素がない場合ではなく、p複数の要素が見つかった場合は要素を非表示にしています。li次に、closest()親要素を調べます。ここで、pは の兄弟であるため、代わりdivに使用する必要があります。prev()これを試して:

$('.clients').each(function() {
    var $ul = $(this);
    if (!$('li', $ul).length) {
        $ul.closest('.clients_wrap').prev('p').hide();
    }
});
于 2013-08-09T08:54:49.300 に答える
0
$(function() {
    $('p.represent').filter(function () {
        return $(this).next("clients_wrap").find("li").length === 0;
    }).hide();
});

この背後にある理論的根拠は、jQuery パラダイムに従います。

  1. 何かを選択 ( $('p.represent'))
  2. 必要に応じてフィルタリングします ( .filter(...))
  3. 何とかしてください ( .hide())
于 2013-08-09T08:57:01.223 に答える