2011-08-08 76 views
1

我一直無法找出(或發現)用於以下情形的解決方案:隱藏/顯示DD元素定義列表

我們有一個dl像這樣:

<dl> 
    <dt>Term</dt> 
     <dd>Item 1</dd> 
     <dd>Item 2</dd> 
     <dd>Item 3</dd> 
     <dd>Item 4</dd> 
     <dd>Item 5</dd> 
    <dt>Term</dt> 
     <dd>Item 1</dd> 
     <dd>Item 2</dd> 
     <dd>Item 3</dd> 
     <dd>Item 4</dd> 
     <dd>Item 5</dd> 
</dl> 

我們需要在每個dt組的前3個之後隱藏所有dds,並顯示「查看更多」鏈接,以便切換剩餘的可見性。

任何提示將不勝感激!

+1

當然你已經嘗試了一些東西。你卡在哪裏? –

回答

0

感謝大家的幫助。這就是我們最終的結果:

$(function(){ 
    $("dt").each(function(){ 
     var $dd = $(this).nextUntil("dt"); 
     if ($dd.length > 3 && $('input:checked', $dd).length < 1) { 
      $dd.filter(":gt(2)").hide(); 
      $dd.last().after($("<dd class='t'>View More</dd>").click(function(e){ 
       e.preventDefault(); 
       $(this).text($(this).text() == "View More"?"Hide More":"View More").prevAll("dt:first").nextUntil("dt").filter(":gt(2):not('dd.t')").toggle() 
      }).css({'cursor':'pointer', 'color':'#0000FF'})); 
     } 
    }); 
}); 
1

可能有更好的方法來做到這一點,但這是我首先想到的。它發現dldt元素,然後通過他們循環,並隱藏了前3後的所有元素,直到下一個dt

$("dl").find("dt").each(function() { 
    var count = 0; 
    $(this).nextUntil("dt").filter(function() { 
     return count++ > 2; 
    }).hide(); 
    $(this).append(" <a href='#' class='showMore'>See more</a>"); 
}); 
$(".showMore").live("click", function() { 
    $(this).closest("dl").find("dt").each(function() { 
     $(this).nextUntil("dt").show(); 
     //As suggested by comments, you may want to hide the 'Show more' link now: 
     $(this).remove(); 
    }); 
}); 

這裏有一個working example

+0

有一個鏈接只顯示(並沒有鏈接隱藏)是一種有效的方式,我已經在很多網站上看到它。我認爲它應該在顯示元素後刪除(或隱藏)「查看更多」鏈接,否則用戶可能會點擊它以期隱藏它。 –

+0

@本 - 同意,這可能是一個不錯的功能。我已經添加了它(請參閱代碼註釋)。 –

1
+0

這不起作用。 'dt'元素沒有任何孩子。 –

+0

糟糕。我應該嘗試運行我的代碼。正在進行修訂。 –

+0

看到我的答案,隨時分手我的小提琴和玩弄。可能有更好的方法。如果'dd'元素進入了'dt',它會更容易! –

1

試試這個

$(function(){ 
    $("dt").each(function(){ 
    var $dd = $(this).nextUntil("dt"), $this; 
    $dd.filter(":gt(2)").hide(); 
    if($dd.length > 3){ 
     $dd.last().after($("<a href='#'>View More</a>").click(function(e){ 
      e.preventDefault(); 
      $(this).text($(this).text() == "View More"?"Hide More":"View More") 
      .prevAll("dt:first").nextUntil("dt").filter(":gt(2):not('a')").toggle() 
     })); 
    } 
    }); 
}); 

工作demo

+0

這不起作用。 'dt'元素沒有任何孩子。 –

+0

我的不好,我以爲dd在dt裏面。 – ShankarSangoli

+0

如果他們真的會更容易!看到我的回答,雖然可能有更好的方法來做到這一點,但隨時可以將小提琴分支出去玩耍! –

1

工作例如:http://jsfiddle.net/APB6F/。該解決方案可讓您選擇切換顯示/隱藏功能。

$("dl").find("dt").each(function(k,v){ 
    var dtObj = $(this); 
    dtObj.nextUntil("dt").filter(function(index){ 
     if(index > 2){ $(this).hide(); } 
    }); 
    dtObj.append("<a href='#' class='view-more'>Show More</a>"); 
}); 

$(".view-more").live('click', function(){ 
    var mObj = $(this); 
    if(mObj.text() == "Show More"){ 
     mObj.closest("dt").each(function(k,v){ 
      var dObj = $(this); 
      dObj.nextUntil("dt").filter(function(index){ 
       $(this).show(); 
      });   
     }); 
     mObj.text("Hide More"); 
    }else{ 
     mObj.closest("dt").each(function(k,v){ 
      var dObj = $(this);    
      dObj.nextUntil("dt").filter(function(index){ 
       if(index > 2){ $(this).hide(); } 
      });   
     }); 
     mObj.text("Show More"); 
    } 
}); 
+0

這不起作用。 OP需要隱藏每一個元素後面的每個組中的前3個'dd'元素,除了'dt'元素之外。這將隱藏所有這些,除了前3個,不管'dt'元素。 –

+0

我想你讀得比我更好:)更新以符合要求。 – RobB