2012-06-05 55 views
2
的所有UL

問:

我有一個類上市有些類別有孩子,我想創建一個所有的類別,點擊後會檢查所有同級複選框,在同一類別。我怎麼能檢查嵌套複選框

例如;點擊ALLMUSIC類別下會檢查blues, jazz, rock n roll

代碼:

HTML:

<ul name="events-categories" id="events-categories"> 
    <li><input type="checkbox" name="category-events" value="185" placeholder="" id="category-185" class="events-category"> CONVENTIONS 
     <ul class="event-children"> 
      <li><input type="checkbox" name="child-category-all" value="" class="events-child-category-all">ALL</li> 
      <li><input type="checkbox" name="child-category-190" value="190" id="child-category-190" class="child events-child-category">SCIENCE</li> 
      <li><input type="checkbox" name="child-category-191" value="191" id="child-category-191" class="child events-child-category">TECHNOLOGY</li> 
     </ul> 
    </li> 
    <li><input type="checkbox" name="category-events" value="184" placeholder="" id="category-184" class="events-category"> MUSIC 
     <ul class="event-children"> 
      <li><input type="checkbox" name="child-category-all" value="" class="events-child-category-all">ALL</li> 
      <li><input type="checkbox" name="child-category-189" value="189" id="child-category-189" class="child events-child-category">BLUES</li> 
      <li><input type="checkbox" name="child-category-188" value="188" id="child-category-188" class="child events-child-category">JAZZ</li> 
      <li><input type="checkbox" name="child-category-187" value="187" id="child-category-187" class="child events-child-category">ROCK N ROLL</li> 
     </ul> 
    </li> 
    <li><input type="checkbox" name="category-events" value="186" placeholder="" id="category-186" class="events-category"> TRIBUTES</li> 
</ul>​ 

CSS:

.event-children { 
    margin-left: 20px; 
    list-style: none; 
    display: none; 
}​ 

jQuery的這麼遠:

/** 
* left sidebar events categories 
* toggle sub categories 
*/ 
$('.events-category').change(function(){ 
    console.log('showing sub categories'); 
    var c = this.checked; 
    if(c){ 
     $(this).next('.event-children').css('display', 'block'); 
    }else{ 
     $(this).next('.event-children').css('display', 'none'); 
    } 
}); 

$('.events-child-category-all').change(function(){ 
    var c = this.checked; 
    if(c){ 
     $(this).siblings(':checkbox').attr('checked',true); 
    }else{ 
     $(this).siblings(':checkbox').attr('checked',false); 
    } 
});​ 

的jsfiddle:http://jsfiddle.net/SENV8/

回答

7
$('.events-child-category-all').change(function(){ 
    $(this).parent().siblings().find(':checkbox').attr('checked', this.checked); 
});​ 

http://jsfiddle.net/SENV8/3/

+0

+1 http://jsfiddle.net/5HTPs/ – mrtsherman

+0

+1用於保存'if-else'檢查。 –

+0

同意!乾淨,簡潔,清晰..喜歡它。 – gorelative

0

你需要的是這樣的,因爲這些checkboxes沒有siblings

$('.events-child-category-all').change(function(){ 
    var c = this.checked; 
    if(c){ 
     $(this).closest('.event-children').find(':checkbox').attr('checked',true); 
    }else{ 
     $(this).closest('.event-children').find(':checkbox').attr('checked',false); 
    } 
});​ 

Working Fiddle

+0

了你,NNNNNN,ahren提供了答案這將是他們最好的,至於性能 – gorelative

+0

@Mike的,你可以使用xdazz的一個,它會爲你節省一個'if-else'檢查。 –

+1

'input [type = checkbox]'是比':checkbox'更高效的選擇器(根據[doco](http://api.jquery.com/checkbox-selector/)),但是真正的用戶不是'我們不會注意到任何這樣的答案與僅有少量複選框之間的區別。 – nnnnnn

0

也許是這樣的:

$(".events-child-category-all").click(function() { 
    $(this).closest("ul").find("input[type=checkbox]").prop("checked",this.checked); 
}); 

.closest() method遍歷了DOM樹查找匹配的元素,在這種情況下,找到「UL」,該複選框位於英寸

如果您使用的是jQuery的版本早於1.6您需要.attr()而不是.prop()

+0

爲什麼不''.prop(「checked」,this.checked)'?他需要取消選中時全部取消選中。 – xdazz

+0

謝謝@xdazz,是的,我一開始並沒有意識到。答案已更正。 – nnnnnn

0

http://jsfiddle.net/ahren/SENV8/2/

$('.events-child-category-all').change(function(){ 
    var c = this.checked; 
    if(c){ 
     $(this).parent().siblings().find(':checkbox').prop('checked',true); 
    }else{ 
     $(this).parent().siblings().find(':checkbox').prop('checked',false); 
    } 
});​ 

沒有siblings到輸入端,change燒製而成。您首先需要向上級li上一級,然後抓住它的siblings,並使用find()獲取其複選框。或者你可以使用的children()代替find()