0

私は次の繰り返し構文を取得<h1>しました。その後に少なくとも 1 つの非表示の div が続くものはすべて保持しますが、残りの orphaned は削除し<h1>ます。

<h1>FIRST</h1>
<div></div>
<div></div>

<h1>SECOND</h1>
<div style="display:none"></div>
<div></div>

<h1>THIRD</h1>
<div style="display:none"></div>
<div style="display:none"></div>

<h1>FOURTH</h1>
<div></div>
<div></div>

ご覧のとおり、<h1>隠されていない の前に div がある場合があります。したがって、3 番目のブロックでは を非表示にしたいのですが、<h1>2 番目のブロックやその他のブロックでは非表示にしたくありません。

私が試したのは、基本的に、間のすべての非表示要素を無視しながら<h1>、別のものが続くケースを検索することです:<h1>

$('h1').each(function(){
    if($(this).nextAll().not(':hidden') == $('h1')) { $(this).hide() }
})

残念ながら、属性が問題である<h1>と思われますが、それはいずれも非表示にならず、その理由を理解できません。私の実際のコードでは、非表示は「display:none」ではなく、jQuerys を使用して非表示になっていることに注意してください:hidden<div>.hide()

誰かが助けてくれることを願っています。

4

3 に答える 3

2

これはあなたが求めているものですか?

すべての H1 について、次の H1 の前にすべての要素を検索し、それらがすべて非表示の場合は、この H1 を非表示にします

$('h1').each(function() {
var elems = $(this).nextUntil('h1');
var elemsHidden = false;
for (var i = 0; i < elems.length; i++) {
    if ($(elems[i]).is(':hidden')) {
        elemsHidden = true;
    } else {
        elemsHidden = false;
    }
}

if (elemsHidden) {
    $(this).hide();
}

});​

アップデート

$('h1').each(function() {
    var elems = $(this).nextUntil('h1');
    for (var i = 0; i < elems.length; i++) {
        if (!$(elems[i]).is(':hidden')) {
            return;
        }
    }        
    $(this).hide();

});​

JSFiddle
http://jsfiddle.net/Mm6Mz/1/

更新 2

$('h1').each(function() {
    $(this).nextUntil('h1').is(':visible') ? 0 : $(this).hide() ;
});​

JSFiddle
http://jsfiddle.net/Mm6Mz/2/

于 2012-06-14T22:45:27.987 に答える
0

非表示を選択してdivから prev を見つけることができますh1。コードを削減し、シンプルに保ちます

$('div:hidden').prev('h1').hide();

ここのjsfiddle http://jsfiddle.net/tkYbh/

于 2012-06-14T22:56:15.207 に答える