2012-11-06 49 views
1

我現在有一個類似的設置請訪問以下鏈接:擴大李時珍的列表隱藏內容

http://jsfiddle.net/d33zC/5/

div的問題:

<ul> 
<li> 
    <a href="#" onclick="toggle2('question', this);">Question</a> 
    <div id="question" style="display:none; margin:0px;"> 
     <input type="text" /> 
    </div> 
</li> 
<li> 
    <a href="#" onclick="toggle2('question2', this);">Question</a> 
    <div id="question2" style="display:none; margin:0px;"> 
     <input type="text" /> 
    </div> 
</li> 
<li> 
    <a href="#" onclick="toggle2('question3', this);">Question</a> 
    <div id="question3" style="display:none; margin:0px;"> 
     <input type="text" /> 
    </div> 
</li> 

注意,這些div已有擴大其中隱藏的內容。

現在,很多問題正在生成,我在一個點,我需要保留一個限制列表,可以擴大與其餘的divs點擊或自動(拉谷歌圖片或微博)。

是否有任何方法可以限制金額,並「展開」列表以顯示其餘列表?

謝謝。

+0

不確定你想要做什麼,請重寫。 – andrewk

+0

當你點擊jsfiddle鏈接時,最好解釋一下,並且想象有20個由此產生的「問題」,我需要限制 – mobile

+0

你是什麼意思的限制?你只想要其中3個只能擴展? – andrewk

回答

1

更新fiddle有很多變化,請參閱註釋的解釋。要點是

  1. 添加類無處不
  2. 增加了「查看更多」 <li>
  3. 環繞在每個<ul>(給定類問題)然後<li>(給定類QN)至設置它
  4. 使用事件聽衆

這是所有在原生JavaScript中完成(不需要jQuery)。 JavaScript的主要位如下

window.addEventListener('load',function load(){ 
    var n_shown_at_start = 3, 
     n_more_displayed_on_click = 3; 

    var qs = document.querySelectorAll('.questions'), 
     qn, sm, i = qs.length, j; 
    while(--i >= 0){ // loop over all questions 
     sm = qs[i].querySelector('.see_more'); // get see more entry 
     qn = qs[i].querySelectorAll('.qn'); // get question <li>s 
     j = qn.length; 
     while(--j >= 0){ 
      qn[j] 
       .querySelector('.qn_vis') // <a> 
       .addEventListener('click', function click(){ // make click display question 
       qn_toggle(this); 
       return false; // no action 
      }, true); 
      if(sm) // if there is a see more button, hide some questions 
       qn[j].style.display = (j < n_shown_at_start ? '' : 'none'); 
     } 
     if(sm){ // if there is a see more button, set it up 
      sm.qs = qs[i]; 
      sm.start = n_shown_at_start; 
      sm.lim = n_more_displayed_on_click; 
      sm.addEventListener('click', function click(){ 
       var qn = this.qs.getElementsByClassName('qn'), q, 
        i = this.start, j = i + this.lim; 
       this.start = j + 1; 
       while(i < j && (q = qn[i++])){ // loop over questions 
        q.style.display = 'block'; 
       } 
       if(!q || !qn[i]){ // if we reached the end 
        this.textContent = 'No More'; 
       } 
      }, false); 
     } 
    } 
}, false); 
0

這是否解決您的問題?

裹在一個隱藏的DIV多餘的人,並顯示顯示全部按鈕被點擊

http://jsfiddle.net/vAZFv/2/

HTML時:

<ul> 
    <li> 
     <a href="#" onclick="toggle2('question', this);">Question</a> 
     <div id="question" style="display:none; margin:0px;"> 
      <input type="text" /> 
     </div> 
    </li> 
    <li> 
     <a href="#" onclick="toggle2('question2', this);">Question</a> 
     <div id="question2" style="display:none; margin:0px;"> 
      <input type="text" /> 
     </div> 
    </li> 
    <li> 
     <a href="#" onclick="toggle2('question3', this);">Question</a> 
     <div id="question3" style="display:none; margin:0px;"> 
      <input type="text" /> 
     </div> 
    </li> 
    <div id="hiddenOnes"> 
      <li> 
     <a href="#" onclick="toggle2('question3', this);">Question11</a> 
     <div id="question3" style="display:none; margin:0px;"> 
      <input type="text" /> 
     </div> 
    </li> 
     <li> 
     <a href="#" onclick="toggle2('question3', this);">Question11</a> 
     <div id="question3" style="display:none; margin:0px;"> 
      <input type="text" /> 
     </div> 
    </li> 
     <li> 
     <a href="#" onclick="toggle2('question3', this);">Question11</a> 
     <div id="question3" style="display:none; margin:0px;"> 
      <input type="text" /> 
     </div> 
    </li> 

    </div> 
</ul> 
<input type="button" id="showAllBtn" value="Show all">​ 

JS:

function toggle2(id, link) { 
    var e = document.getElementById(id); 
    if (e.style.display == '') { 
     e.style.display = 'none'; 
    } else { 
     e.style.display = ''; 
    } 
} 
$(function() { 
    $("#hiddenOnes").hide(); 
    $("#showAllBtn").click(function() { 
     $("#hiddenOnes").show(); 
    }); 
});​ 
+0

差不多!謝謝!由於將會有更多,這些可以逐漸擴大?一次說5個? – mobile

+0

那麼,如果這樣的話,我會每次點擊按鈕時使用AJAX從服務器獲取下一組。否則,如果您計劃最初提取數千個問題,則您的初始頁面加載速度會變得非常慢......如果此選項不適合,請告訴我,我可以幫助您編寫客戶端加強版。 –

+0

AJAX聲音好,但我不知道從哪裏開始! – mobile

0

你可以做這樣的事情:

http://jsfiddle.net/vZnJb/3/

首先,通過增加style="display:none;"像你已經爲你的div做隱藏所有li的。然後,在按下一個按鈕或點擊一個鏈接後,您可以用document.getElementsByTagName("li");遍歷所有li,將其刪除一定數量。

JS代碼:

var shown = 1; 
var expand_per = 1; 

function expand() { 
    shown += expand_per; 
    var allLists = document.getElementsByTagName("li"); 
    i = 0; 
    while (i < shown) { 
     if (allLists[i] === undefined) { 
      break; 
     } 
     if (allLists[i].style.display == 'none') { 
      allLists[i].style.display = ''; 
     } 
     i++ 
    } 
}​ 

編輯:當然,在現實生活中的情況下,你會獲取從數據庫中的所有問題,由Sajjan薩卡提及。

+0

其他內容在同一列表中顯示爲具有不同的id(而不是問題),他們是否需要增加才能使用它? – mobile

+0

既然你正在顯示或隱藏列表項,而不管他們的ID是什麼,你可以在這些'li'中添加任何東西,它會遵循相同的邏輯。 –

0

這是另一種解決方案,它可以滿足您的所有需求。

JS FIDDLE: http://jsfiddle.net/erRCy/

HTML:

<ul class="topnav"> 
    <li>Question</li> 

    <li>Question</li> 

    <li>Question</li> 

    <li>Question11</li> 

    <li>Question11</li> 

    <li>Question11</li> 

    <li>Question11</li> 
</ul> 
<input type="button" id="showAllBtn" value="Show all"> 

CSS:

.visible{ 
display:block; 
} 

.invisible{ 
display:none; 
} 

JS:

<script> 
    // Make all LIs under the UL(with class=topnav) invisible 
    $("ul.topnav > li").addClass('invisible'); 

    // when the button is clicked 
    $("#showAllBtn").click(function() { 
     var gITEMS_PER_SET = 2; // set the no of items you want to show per set 
     //get next set of LIs which are invisible and make them visible 
     $("ul.topnav > li.invisible").slice(0, gITEMS_PER_SET).removeClass('invisible').addClass('visible'); 

    }); 
    // simulate the button click to show the initial set when page loads 
    $("#showAllBtn").click();​ 
<script> 
​