개발노트/jQuery
[jQuery] 체크박스 핸들링 (전체/개별 선택)
dev-mylee
2025. 1. 4. 11:16
오늘은 체크박스 이벤트 처리하면서 배운 내용들을 정리해본다.
처음에는 단순하게 생각했다가 여러 엣지케이스를 만나면서 꽤 많이 고생했다...
1. 전체 선택 구현
가장 기본적인 전체 선택/해제 로직:
// HTML
<input type="checkbox" id="checkAll">
<input type="checkbox" name="chkConfirm" class="checkOrder">
<input type="checkbox" name="chkConfirm" class="checkOrder">
<input type="checkbox" name="chkConfirm" class="checkOrder">
// JavaScript
$('#checkAll').change(function(){
// true/false 상태 가져오기
var checkState = $(this).prop("checked");
// 모든 개별 체크박스에 상태 적용
$('input:checkbox[name="chkConfirm"]').prop("checked", checkState);
// 버튼 상태도 같이 제어
$('#btnSave').prop('disabled', !checkState);
});
2. 개별 체크박스 처리
여기서 재미있는 부분이 나온다. 개별 체크박스를 조작할 때 전체 선택 체크박스도 같이 관리해줘야 한다:
$(document).on('change', '.checkOrder', function(){
var allCheckState = true;
// 모든 체크박스를 순회하면서 하나라도 체크 해제된게 있는지 확인
$('input:checkbox[name="chkConfirm"]').each(function() {
if(!this.checked) {
allCheckState = false;
return false; // 반복문 종료
}
});
// 전체 선택 체크박스 상태 변경
$("#checkAll").prop("checked", allCheckState);
// 선택된 항목 개수에 따른 버튼 활성화
var checkedCount = $('input:checkbox[name="chkConfirm"]:checked').length;
$('#btnSave').prop('disabled', checkedCount === 0);
});
3. 선택된 데이터 처리
이제 체크된 항목들의 데이터를 실제로 처리해야 한다:
function processCheckedItems() {
var checkedItems = [];
$('input:checkbox[name="chkConfirm"]:checked').each(function() {
// 체크박스와 연관된 데이터 가져오기
var itemId = $(this).closest('tr').data('id');
var itemData = {
id: itemId,
// 필요한 다른 데이터들...
};
checkedItems.push(itemData);
});
if(checkedItems.length === 0) {
alert('선택된 항목이 없습니다.');
return;
}
// 데이터 처리 로직
processData(checkedItems);
}
✅ 메모
1. 이벤트 위임 사용하기
// 이렇게 하면 동적으로 추가된 체크박스도 처리 가능
$(document).on('change', '.checkOrder', function(){})
2. disabled 상태의 체크박스 주의
// disabled된 체크박스는 체크 개수 세거나 데이터 처리할 때 제외
$('input:checkbox[name="chkConfirm"]:not(:disabled):checked')
3. 체크박스 상태 초기화
// 페이지 로드시 체크박스 상태 초기화
function initCheckboxes() {
$('#checkAll').prop('checked', false);
$('.checkOrder').prop('checked', false);
}
4. 체크박스 상태 변경시 시각적 피드백
// 체크된 행 하이라이트
$(this).closest('tr').toggleClass('selected', this.checked);