2011-07-03 54 views
6

我正在使用javascript來創建結果列表。我有一個循環遍歷一些數據並創建一個mydata div,並將其添加到結果div中。讓我們假設它看起來是這樣的:如何隱藏我列表中的元素並添加「顯示更多」功能?

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

我想要做的就是只顯示5個結果同時,並且如果用戶希望看到更多的,他們可以點擊旁邊一個顯示5顯示更多按鈕(或類似的東西)。有任何想法嗎?

只是爲了澄清,每次用戶點擊「顯示更多」我想'取消隱藏'未來5個元素,而不是所有其餘的元素。所以每次點擊都會顯示更多元素,直到全部顯示。

+0

如果您使用的是jQuery,我會建議看看這個分頁插件:http://plugins.jquery.com/project/pagination –

+0

@James Allardice,看起來像一個甜蜜的插件。如果我有更大的數據集,我肯定會考慮使用它。謝謝! – whoabackoff

回答

11

您可以使用gt()lt()選擇與:visible很好這裏一起。

以下將顯示點擊後的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,他們將永遠不會隱藏,也不會出現該按鈕等等,所以它有一個完整的無腳本回退+搜索引擎不喜歡隱藏的內容(但他們不會知道它的隱藏,如果你在DOM負載上執行)。

+0

是的!這正是我正在尋找的!用'淡入'看起來不錯! – whoabackoff

+0

我不知道爲什麼,但在運行時,「顯示更多」錨點沒有正確創建。當我檢查下谷歌瀏覽器時出現以下錯誤:「uncaught TypeError:Object# has no method'last'」 – whoabackoff

+1

@whoabackoff您是否在我的jsfiddle或您自己的實現上收到該錯誤,因爲它對我來說工作正常在Chrome中。 'last()'是在jQuery 1.4版本中添加的,所以如果你使用的是舊版本,那麼你可以用'.filter(「:last」)替換'.last()'' – Niklas

1

您可以創建一個CSS類,如:

.hiddenData { display: none } 

並將其連接到超過5

之後從的需要的數量添加/刪除該類使處理器的div任何數量div的。

jQuery的類刪除:

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

創建一類的東西,如:

.hidden_class{ 
    display: none; 
} 

這個類添加到所有你不想看到的MYDATA div的。 當用戶點擊該按鈕時,將其從下一個5格中移除。

重複每次用戶點擊「更多」按鈕

+0

這與伊戈爾的回答非常相似 – whoabackoff

1

這應該工作...讓我知道如何去

<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> 

在你的for循環,你還必須添加這些div隱藏容器

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

你的想法。

+0

我不想修改div的列表,另外,我只想要1'更多'按鈕 – 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且高於總數。但那很容易。

編輯:在這裏,你有它運行:http://jsfiddle.net/U8Q4Z/

希望這有助於。乾杯。

+0

謝謝!這也是一個很好的實現,它處理'Previous'和'Next'。唯一的問題是如果列表小於6,導航鏈接仍然可見。 – whoabackoff

3

我的解決方案在這裏:jsFiddle

你可以把這個鏈接的地方:

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

,並使用下面的代碼:

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

其中limit是顯示你目前的結果的數量和per_page是每次點擊顯示的結果數上「顯示更多」。如果顯示所有結果,鏈接將消失。看看它如何works on jsFiddle

+0

偉大的實現,處理每頁可變數量的初始結果和結果。 – whoabackoff

+0

@whoabackoff:thx :) – Tadeck