2011-07-03 15 views
6

私は結果のリストを作成するためにjavascriptを使用しています。私はfor-loopをいくつかのデータを繰り返し、mydata divを作成し、それを結果divに追加します。のは、それがこのようなものになりますふりをしてみましょう:表示のみが時間の5つの結果である私が何をしたいのかリストの要素を非表示にして、「詳細を表示」機能を追加するにはどうすればよいですか?

<div id="results"> 
    <div class="mydata">data 1</div> 
    <div class="mydata">data 2</div> 
    ... 
    <div class="mydata">data 20</div> 
</div> 

を、ユーザーがより多くのを見たいはずです、彼らは次の5ショーをクリックすることができますか詳細を表示ボタン(または同様のもの)。何か案は?

ユーザーが「もっと見る」をクリックするたびに、残りの要素すべてではなく、次の5つの要素を再表示したいと思います。各クリックが表示されるまで、各クリックにより多くの要素が明らかになります。

.hiddenData { display: none } 

をし、それがの必要量から、このクラスを追加/削除するためのハンドラを作成した後5.

を超えたdiv要素の任意の量に添付:

+0

jQueryを使用している場合、私はこのページングプラグインを見てみることをお勧めします:http://plugins.jquery.com/project/pagination –

+0

@James Allardice、これはスイートプラグインのようです。より大きなデータセットを持っていれば、私は間違いなくこれを使って調べるでしょう。ありがとう! – whoabackoff

答えて

11

「続きを読む」クリックします。

次の5つの結果をクリックして表示し、すべての項目が表示されたらリンクを削除します。

$('.mydata:gt(4)').hide().last().after(
    $('<a />').attr('href','#').text('Show more').click(function(){ 
     var a = this; 
     $('.mydata:not(:visible):lt(5)').fadeIn(function(){ 
     if ($('.mydata:not(:visible)').length == 0) $(a).remove(); 
     }); return false; 
    }) 
); 

作業例:関係なく、他の人がここで示唆されているもののhttp://jsfiddle.net/niklasvh/nTv7D/

、私はないはCSSを使って要素を隠しますが、ユーザーはJSが無効になっている場合ので、代わりにJSでそれを行うと、 CSSを使用して要素を非表示にすると、表示されません。しかし、JSが無効になっていると、隠されたり、ボタンが表示されたりすることはありません。そのため、完全なnoscriptの代替機能があります+検索エンジンは隠しコンテンツが嫌いです(ただし、 DOM負荷で行う)。

+0

はい!これはまさに私が探しているものです! 'fadeIn'で素敵に見えます! – whoabackoff

+0

私は理由は分かりませんが、実行時には、「もっと表示する」アンカーが適切に作成されていません。 google chromeで調べると、次のようなエラーが表示されます。 "uncaught TypeError:Object#には最後のメソッドがありません" – whoabackoff

+1

@whoabackoff jsfiddleまたは自分の実装でエラーが発生していますか? Chromeで'last()'がjQueryバージョン1.4で追加されたので、古いバージョンを使用している場合は '.last()'を '.filter(":last ")' – Niklas

1

あなたのようなCSSクラスを作成することができますdivs。削除するクラスの

のjQuery:

.hidden_class{ 
    display: none; 
} 

あなたは見たくないすべてのMYDATAのdivのにこのクラスを追加します。

$(".hiddenData").removeClass("hiddenData") 
1

のようなものを持つクラスを作成します。 ユーザーがボタンをクリックすると、次の5つのdivからそのボタンを削除します。

繰り返し毎回ユーザーは、あなたがここに:visibleかなりよく一緒にgt()lt()セレクタを使用することができ、ボタン

+0

これはイゴールの答えに非常に似ています – whoabackoff

1

これは動作するはずです...私はそれはあなたのforloopで

<script type="text/javascript"> 
    function ShowHide(id) { $("#" + id).toggle(); } 
</script> 
<div id="results"> 
    <div class="mydata">data 1</div> 
    <div class="mydata">data 2</div> 
    <div class="mydata">data 3</div> 
    <div class="mydata">data 4</div> 
    <div class="mydata">data 5</div> 

    <div style="clear:both" onclick="ShowHide('grp6')">More</div> 
    <div id="grp6" style="display:none"> 
     <div class="mydata">data 6</div> 
     <div class="mydata">data 7</div> 
     <div class="mydata">data 8</div> 
     <div class="mydata">data 9</div> 
     <div class="mydata">data 10</div> 
    </div> 
    <div style="clear:both" onclick="ShowHide('grp11')">More</div> 
    <div id="grp11" style="display:none"> 
     <div class="mydata">data 11</div> 
     <div class="mydata">data 12</div> 
     <div class="mydata">data 13</div> 
     <div class="mydata">data 14</div> 
     <div class="mydata">data 15</div> 
    </div> 
</div> 

を行く方法を知ってみましょう、あなたはまた、あなたのアイデアを得る隠されたコンテナに

<div style="clear:both" onclick="ShowHide('grp6')">More</div> 
    <div id="grp6" style="display:none"> 

をこれらのdivを追加する必要があります。ここで

+0

私はdivのリストを変更する必要はありません、また、私は1つの 'More'ボタンを持ってほしい – whoabackoff

0

あなたが持っている:

<style> 
     /*This hides all items initially*/ 
     .mydata{ 
     display: none; 
     } 
    </style> 

今スクリプト

<script> 
     var currentPage = 1; //Global var that stores the current page 
     var itemsPerPage = 5; 
     //This function shows a specific 'page' 
     function showPage(page){ 
      $("#results .mydata").each(function(i, elem){ 
       if(i >= (page-1)*itemsPerPage && i < page*itemsPerPage) //If item is in page, show it 
       $(this).show(); 
       else 
       $(this).hide(); 
      }); 
      $("#currentPage").text(currentPage); 
     } 
     $(document).ready(function(){ 
      showPage(currentPage); 
      $("#next").click(function(){ 
      showPage(++currentPage); 
      }); 
      $("#prev").click(function(){ 
      showPage(--currentPage); 
      }); 
     }); 
    </script> 

とサンプルのhtml:

<div id="results"> 
     <div class="mydata">data 1</div> 
     <div class="mydata">data 2</div> 
     <div class="mydata">data 3</div> 
     <div class="mydata">data 4</div> 
     <div class="mydata">data 5</div> 
     <div class="mydata">data 6</div> 
     <div class="mydata">data 7</div> 
     <div class="mydata">data 8</div> 
     <div class="mydata">data 9</div> 
     <div class="mydata">data 10</div> 
     <div class="mydata">data 11</div> 
     <div class="mydata">data 12</div> 
    </div> 
    <a href="javascript:void(0)" id="prev">Previous</a> 
    <span id="currentPage"></span> 
    <a href="javascript:void(0)" id="next">Next</a> 

残りの唯一の事は、ページに行かないFOT検証することです1より低く、合計よりも高い。しかし、それは簡単になります。

EDIT:ここでは、それが実行されている:http://jsfiddle.net/U8Q4Z/

は、この情報がお役に立てば幸いです。乾杯。

+0

ありがとう!これは、 'Previous'と 'Next'を処理する優れた実装です。リストが6より小さい場合にのみナビゲーションリンクが引き続き表示されます。 – whoabackoff

3

私の解答はjsFiddleです。

あなたはどこかにこのリンクを置くことができます。

<a href="#" title="" id="results-show-more">show more</a> 

をし、次のコードを使用しlimitが表示された結果の現在の数であるとper_pageは、各クリックで示された結果の数である

var limit = 5; 
var per_page = 5; 
jQuery('#results > div.mydata:gt('+(limit-1)+')').hide(); 
if (jQuery('#results > div.mydata').length <= limit) { 
    jQuery('#results-show-more').hide(); 
}; 

jQuery('#results-show-more').bind('click', function(event){ 
    event.preventDefault(); 
    limit += per_page; 
    jQuery('#results > div.mydata:lt('+(limit)+')').show(); 
    if (jQuery('#results > div.mydata').length <= limit) { 
     jQuery(this).hide(); 
    } 
}); 

を"もっと見る"。すべての結果が表示されると、リンクは消えます。どのようにそれを参照してくださいworks on jsFiddle

+0

最初の結果とページごとの結果の可変数を処理する優れた実装。 – whoabackoff

+0

@whoabackoff:thx :) – Tadeck

関連する問題