Воу, я в замешательстве. похоже, что у вас есть входы с другими входами внутри них? ... что не имеет смысла. Вот то, что я думаю как выглядит ваша структура, вот и я.
<div class="parent">
<input type="checkbox" />
<div>
<input type="checkbox" />
<input type="checkbox" />
</div>
<input type="checkbox" />
<div>
<input type="checkbox" />
<input type="checkbox" />
</div>
</div>
А вот код, который я бы использовал.
$("input[type='checkbox']").click(function() {
// turn on or off all descendants.
$(this) // get this checkbox
// get the div directly after it
.next('div')
// get ALL the inputs in that div (not just first level children)
.find("input[type='checkbox']")
.attr("checked", this.checked)
;
// now check if we have to turn the parent on or off.
$(this)
.parent() // this will be the div
.prev('input[type="checkbox"]') // this is the input
.attr(
"checked", // set checked to true if...
this.checked // this one is checked, or...
|| $(this).siblings("input[type='checkbox'][checked]").length > 0
// any of the siblings are checked.
)
;
});
обновление: я только что проверил это, и оно полностью работает (ух!). Он также работает с любым количеством уровней вложенности, а не только с двумя.