2010-03-09 67 views
1

所以我有我一直在抨擊我的頭撞牆了一段時間相當基本的JavaScript問題:JavaScript的原型問題

<div class='alist'> 
    <ul> 
     <li class='group_1'> An Item </li> 
     <li class='group_1'> An Item </li> 
     <li class='group_2'> An Item </li> 
    </ul> 
</div> 

<div class='alist'> 
    <ul> 
     <li class='group_1'> An Item </li> 
     <li class='group_1'> An Item </li> 
     <li class='group_2'> An Item </li> 
    </ul> 
</div> 


<script> 
function toggle_item(num){ 
    $$('li.group_' + num).invoke('toggle'); 
} 
</script> 

基本上,我需要創建一個清道夫,設置在div顯示:如果所有的li都顯示:none。

我認爲這將開始喜歡:

function sweep(){ 
    $$('div.alist').each(function(s) { 
     ar = s.down().children 
    }); 
} 

好的教程任何建議將受到歡迎以及

回答

2

像這樣的東西可能會讓你開始。你需要遍歷孩子,並檢查它們是否可見。如果其中任何一個不是,請設置一個標誌並從循環中斷開。如果該標誌爲假,那麼你不需要隱藏div

function sweep(){ 
    $$('div.alist').each(function(s) { 
     var shouldHide = true; 
     var children = s.down().childElements(); 
     children.each(function(li) { 
      if(li.visible()) { 
       shouldHide = false; 
       throw $break; 
      } 
     }); 

     if(shouldHide) { 
      s.hide(); 
     } 
    }); 
} 
+0

注:我沒有測試此 - 我對我的工作方式! – 2010-03-09 16:18:30

+0

作品很有魅力,謝謝。 – 2010-03-09 17:53:33

1

你可以使用的Elementselect()方法來找到所有li後代。併爲每個li運行一個方法Array.all並檢查是否全部返回true。隱藏div如果全部返回true。

function sweep() { 
    // check each div 
    $$('div.alist').each(function(element) { 
     var listItems = element.select('li'); 
     // are the list items of this div hidden? 
     var listItemsHidden = listItems.all(function(item) { 
      return item.visible(); 
     }); 
     // hide the div too if so 
     if(listIemsHidden) { 
      element.hide(); 
     } 
    }); 
} 

此代碼未經測試。

0

這是jQuery的解決方案(原型必須是類似的東西):

$('div.alist').css('display', function() { 
     return $(this).find('li:visible').length < 1 ? 'none' : ''; 
    });