2016-07-29 38 views
0

我有一個菜單列出了在另一個列表中顯示內容的項目。如果使用data-id爲空,則顯示none none

MENU

<ul id="gallery-list" style="display: none;"> 
     <li class="close"></li> 
     <li data-id="9425"><strong>item 1</strong></li> 
     <li data-id="9426"><strong>item 2</strong></li> 
     <li data-id="9488"><strong>item 3</strong></li> 
     <li data-id="9489"><strong>item 4</strong></li> 
     <li data-id="9495"><strong>item 5</strong></li> 
     <li data-id="9427"><strong>item 6</strong></li> 
</ul> 

內容:

<ul id="gallery-container"> 
     <li data-id="9425"> 
      <h3 style="display: none;">Item 1</h3> 
      <div class="content">Content here</div> 
     </li> 
     <li data-id="9426"> 
      <h3 style="display: none;">Item 2</h3> 
     </li> 
     <li data-id="9488"> 
      <h3 style="display: none;">Item 3</h3> 
     </li> 
     <li data-id="9489"> 
      <h3 style="display: none;">Item 4</h3> 
     </li> 
     <li data-id="9495"> 
      <h3 style="display: none;">Item 5</h3> 
      <div class="content">Content here</div> 
     </li> 
     <li data-id="9427"> 
      <h3 style="display: none;">Item 6</h3> 
      <div class="content">Content here</div> 
     </li> 
</ul> 

在內容有,在li.content。我如何使用data-id來隱藏菜單部分中的項目?基本上菜單中的項目只應顯示,如果它有.content

菜單的輸出應該是這樣的。

<ul id="gallery-list" style="display: none;"> 
     <li class="close"></li> 
     <li data-id="9425"><strong>item 1</strong></li> 
     <li data-id="9495"><strong>item 5</strong></li> 
     <li data-id="9427"><strong>item 6</strong></li> 
</ul> 

或者這也應該沒關係。

<ul id="gallery-list" style="display: none;"> 
     <li class="close"></li> 
     <li data-id="9425"><strong>item 1</strong></li> 
     <li data-id="9425" style="display:none;"><strong>item 2</strong></li> 
     <li data-id="9425" style="display:none;"><strong>item 3</strong></li> 
     <li data-id="9425" style="display:none;"><strong>item 4</strong></li> 
     <li data-id="9495"><strong>item 5</strong></li> 
     <li data-id="9427"><strong>item 6</strong></li> 
</ul> 

不是那個項目的內容總是display:none; onload觸發器。

也是用這個腳本:

$("#gallery-list li").click(function() { 
     var id = $(this).data('id'); 
      $("#gallery-container").find('li').each(function() { 
      $(this).find('.content').toggle($(this).data('id') === id); 
      $(this).find('h3').toggle($(this).data('id') === id); 
     }); 
    }); 
    window.onload = function() { 
     $("#gallery-container li .content").css("display", "none"); 
     $("#gallery-container li h3").css("display","none"); 
     $("#gallery-container li p").css("display","none"); 
    } 
    $('.gallery-menu h3, #gallery-list li').click(function(){ 
     $("#gallery-list, .gallery-menu h3").toggle(); 
    }); 

它控制列表的內容也激活菜單。

+1

吹毛求疵:'的window.onload =函數(){...}'應該是'$(窗口).load(函數(){...})',或者你可能會覆蓋其他正在發生的onload事件(jQuery允許多個事件處理程序以這種方式)。如果你使用'toggle()'你應該使用'hide()'和'show()'來獲得一致性而不是'css('display','...')' –

+0

謝謝你注意@ XerenNarcy – MIke

回答

2

我的想法:
循環播放內容列表項目,當沒有.content可用時,remove有關的菜單項。

$(function() { 
    $("#gallery-container li[data-id]").each(function() { 
     if($(".content", this).length == 0) { 
      $("#gallery-list li[data-id=" + $(this).data("id") + "]").remove(); 
     } 
    }); 
}); 

由於@XerenNarcy在評論中注意到,你甚至可以用一個not()has()組合選擇:

$(function() { 
    $("#gallery-container li[data-id]:not(:has(.content))").each(function() { 
     $("#gallery-list li[data-id=" + $(this).data("id") + "]").remove(); 
    }); 
}); 

相反的remove()你yould甚至使用hide()

Working example.

+0

你可以使用':has'選擇器來簡化它,例如:'#gallery-container li [data-id]:has(.content)' –

+0

你是對的,但它應該是': not(:has(.content))'然後,@XerenNarcy – eisbehr

+0

不等待...不是':not(:has())'? –