2009-04-29 6 views
1

長いサブリストの要素を隠すことで、サーバー側で余分な処理を追加することなく、長いリストを短くしたい。問題は、サーバーから来るマークアップが私によって制御されておらず、仕事を簡単にするように設計されていないことです。ここにコードがありますjQueryを使用して余分な項目を非表示にする(マークアップは理想的ではない)

<ul id="long-list"> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="header"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="header"></li> 
    <li class="item"></li> 
    . 
    . 
    . 
</ul> 

あなたが気づいたように、ヘッダーはアイテムに兄弟です。今、各ヘッダーの後に3つの項目しか表示しないjQueryコードを作成し、リストを短くしてより使いやすくするために残りを隠したいとします。

$('#long-list li.header ~ li.item:gt(3)').hide(); 
    $('#long-list li.header ~ li.item:lt(3)').show(); 
    $('#long-list li.header').show(); 

余分な機能は、アイテムを隠して、各セクションの下にあるノードを追加隠されているどのように多くのアイテムと言って、5」と言っている:ここで

ない働いている私の試みですもっと...」

答えて

1

これはこれを実装した方法です。隠しアイテムがあるサブリストの最後にノードを追加する、xアイテムが隠されていること、隠しアイテムを切り替えるonclickイベントをバインドするなどのいくつかの他の機能があることに注意してください。

if ($('#list li.header')[0]) {  
     var i = -1000; 
     $("#list > li").each(function(){ 
     if ($(this).hasClass("header")) { 
      (i>3) && ($(this).before("<li class='more'>" + (i-3) + " more...</li>").bind("click", toggle_more()) ); 
      i = 0; 
     } 
     else { 
      i = i+1; 
     } 
     $(this).toggle(i<=3); 
     }); 
    } 

これは基本的に上記のsvintoに基づいています。私はまだより良いパフォーマンスを探します。とにかく、今、私は結果に満足しています。

iを-1000で開始すると、リストの先頭にある項目がヘッダーを持たないように表示されなくなります。ヘッダーに達すると、iを0に設定してカウントを開始します。

3

は良く行うことが可能かもしれないが、これは動作するはずです:

var i = 0; 
$("#long-list li.header:first").nextAll("li").each(function(){ 
    i = $(this).hasClass("header") ? 0 : i+1; 
    $(this).toggle(i<=3); 
}); 

(最初の前の項目を非表示にしないように更新しますヘッダー)

+0

ありがとうございますが、まず最初に、各項目をループすると、現代のブラウザでさえもひじになる可能性があります。 次に、サンプルコードにリストされているように、そこのリストの最初にどのヘッダーにも属していないものはすべて隠してはいけません。 –

+1

私はあなたが何とかアイテムをループすることなくこれを行うことができるのではないかと疑います。明示的なループなしで何かを書くことができたとしても、jQuery内にループが残っています... – svinto

+0

.nextAll()の使用に関する1つの問題は、ヘッダー内に3つ未満の項目がある場合、別のヘッダーをオーバーシュートする可能性があることです。 – Soviut

0

jqueryではループなしでこれを行うことはできません。

0

これは私にとってはうまくいくようですが、論理的には、兄弟セレクタだけを使ってオリジナルの試みの意図に従っているようです。

$("li.header:first").prevAll("li.item").hide(); 
    $("li.header").each(function() { 
    $(this).nextAll("li.item:lt(3)").show(); 
    $(this).nextAll("li.item:gt(3)").hide(); 
    }); 
関連する問題