順序付けられていないリストを思いつく唯一の解決策は、次のように、2番目の順序付けられていないリストの前にリスト項目を閉じることによって、無効なマークアップを使用することでした。
<ul>
<li>Level 1a</li>
<ul>
<li>Level 2a</li>
<li>Level 2b</li>
</ul>
</li>
<li>Level 1b</li>
<ul>
<li>Level 2c</li>
<li>Level 2d</li>
</ul>
</li>
</ul>
私はこれが気に入らなかったので、次のような構造をセットアップしました。
<div class="selectable">
<div id="level1">Level 1</div>
<div class="subgroup level1">
<div id="level1a">Level 1a</div>
<div id="level1b">Level 1b</div>
</div>
<div id="level2">Level 2</div>
<div class="subgroup level2">
<div id="level2a">Level 2a</div>
<div id="level2b">Level 2b</div>
</div>
</div>
次に、次のように選択可能なものをセットアップします。
$('.selectable').selectable({
selected: function (event, ui) {
if ($(ui.selected).hasClass('click-selected')) {
$(ui.selected).removeClass('click-selected');
$('.'+ui.selected.id).removeClass('click-selected');
$('.'+ui.selected.id+' div').removeClass('click-selected');
} else {
$(ui.selected).addClass('click-selected');
$('.'+ui.selected.id).addClass('click-selected');
if ($(ui.selected).parent('.subgroup').length) {
$(ui.selected).parent('.subgroup').removeClass('click-selected');
var cNames = $(ui.selected).parent('.subgroup').attr('class').replace("subgroup","").split(" ");
$.each(cNames, function(i,c){
if ($(ui.selected).parent('.subgroup').children().length == $(ui.selected).parent('.subgroup').children('.click-selected').length) {
$('#'+c).addClass('click-selected');
} else {
$('#'+c).removeClass('click-selected');
}
});
}
}
},
filter: "div:not(.subgroup)"
});
これが行うことは、サブグループ以外の任意の div をセレクターにすることです。次に、既存の選択を維持しながら、選択のオンとオフをクリックできるようにするため、新しいクラスのクリック選択を追加します。すべての子が選択されている場合は最初のレベルを選択し、選択されていない場合は選択を解除し、最初のレベルですべての子のオンとオフを切り替えたいと考えました。