Other users have provided interesting solutions, but here's an alternative if you find it interesting, I'll put it in javascript and jquery:
Reversal of Selections
JQUERY
$(document).on('click', '#all', function (e) {
$('input[type="checkbox"]').not('#all').each(function() {
var checked = $(this).is(':checked');
checked ? $(this).prop('checked', false) : $(this).prop('checked', true);
});
});
JAVASCRIPT
document.getElementById("all").addEventListener("click", function(){
checkBoxs = document.querySelectorAll('input[type="checkbox"]:not([id=all])');
//"Hack": http://toddmotto.com/ditch-the-array-foreach-call-nodelist-hack/
[].forEach.call(checkBoxs, function(checkbox) {
checkbox.checked = checkbox.checked ? false : true;
});
});
Example: link
EDIT
Select / Deselect All
var checkedAll = false;
//JQUERY
$(document).on('click', '#all', function (e) {
$('input[type="checkbox"]').not('#all').each(function() {
//Verificamos se é a hora de dar checked a todos ou tirar;
checkedAll ? $(this).prop('checked', false) : $(this).prop('checked', true);
});
//Invertemos ao final da execução, caso a última tenha sido true para checar todos, tornamos ele false para o próximo clique;
checkedAll = checkedAll ? false : true;
});
//JAVASCRIPT
document.getElementById("all").addEventListener("click", function(){
checkBoxs = document.querySelectorAll('input[type="checkbox"]:not([id=all])');
//"Hack": http://toddmotto.com/ditch-the-array-foreach-call-nodelist-hack/
[].forEach.call(checkBoxs, function(checkbox) {
//Verificamos se é a hora de dar checked a todos ou tirar;
checkbox.checked = checkedAll ? false : true;
});
//Invertemos ao final da execução, caso a última tenha sido true para checar todos, tornamos ele false para o próximo clique;
checkedAll = checkedAll ? false : true;
});
Example: link
If you have any questions or are not what you are looking for, please let us know.