I have added check-boxes dynamically to all the element and successfully added the functionality to select all checkboxes but not able to do the selection for the parent chi
try something along these lines:
$this.children('input[type="checkbox"]').prop('checked', true);
You can split the work into two.
Edited:
var json = {
Asia: [{
regionList: [{
regionName: "Eastern Asia",
Countrylist: [{
countryName: "China",
subCountryList: [{
subCountryName: "Southern China"
}]
}, {
countryName: "Hong Kong"
}]
}, {
regionName: "Southern Asia",
Countrylist: [{
countryName: "India"
}, {
countryName: "Pakistan"
}]
}]
}]
};
var html = '';
$.each(json, function(i1, object) {
html += '<li><input type="checkbox"/><b><a name="' + i1 + '" >' + i1 + '</a></b>';
$.each(object, function(i2, continent) {
html += '<ul>';
$.each(continent.regionList, function(i3, region) {
html += '<li><input type="checkbox"/><b>' + region.regionName + '</b><ul>';
$.each(region.Countrylist, function(i4, country) {
html += '<li><input type="checkbox"/>' + country.countryName;
if (country.subCountryList) {
html += '<ul>';
$.each(country.subCountryList, function(i5, subCountry) {
html += '<li><input type="checkbox"/>' + subCountry.subCountryName + '</li>';
});
html += '</ul>';
};
html += '</li>';
});
html += '</ul></li>';
});
html += '</ul>';
});
html += '</li>';
});
$(function() {
$('#list').html(html);
$('#regionContent').on('change', 'input[type=checkbox]', onChange);
});
var topNodes = function(chkbx) {
return $(chkbx).closest('ul').closest('li');
};
var markTopNodes = function(nodes) {
if (!nodes.length) return;
var chkbx = nodes.children('input').eq(0); //parent checkbox
//get the immediate li's of the node
var lis = nodes.children('ul').children('li');
//get count of un-checked checkboxes
var count = lis.children('input[type=checkbox]:not(:checked)').length;
//mark if count is 0
chkbx.prop('checked', !(count));
//recursive call for other top nodes
markTopNodes(topNodes(chkbx));
};
var onChange = function(e) {
//for child nodes, checked state = current checkbox checked state
$(this).closest('li').find('input[type=checkbox]').prop('checked', this.checked);
//for parent nodes, checked if immediate childs are checked, but recursively
markTopNodes(topNodes(this));
};
li {
list-style: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="regionContent">
<ul>
<!-- updated the html here -->
<li>
<input type='checkbox' />All Countries
<ul id='list'></ul>
<!-- added this -->
<li>
</ul>
</div>
The following will check all children checkboxes, deeper than 1 level using find
rather than children
.
$(document.body).on('change', 'input[type=checkbox]', function(){
if($(this).is(':checked')){
$(this).find('input[type="checkbox"]').prop('checked', true);
}
});