if (target.tagName != 'TD') return; // TD에서 발생한 게 아니라면 아무 작업도 하지 않습니다,
highlight(target); // 강조 함 };
functionhighlight(td) { if (selectedTd) { // 이미 강조되어있는 칸이 있다면 원상태로 바꿔줌 selectedTd.classList.remove('highlight'); } selectedTd = td; selectedTd.classList.add('highlight'); // 새로운 td를 강조 함 }
만약 td 안에 strong이라는 요소가 있어서 strong 요소를 클릭했다면 event.target은 strong 이 될 것이다.
이런 부분을 반영하여 코드를 고친다.
1 2 3 4 5 6 7 8 9
table.onclick = function(event) { let td = event.target.closest('td'); // (1)
if (!td) return; // (2)
if (!table.contains(td)) return; // (3)
highlight(td); // (4) };
event.target.closet(selector)을 활용하여 elem의 상위 요소 중 selector와 일치하는 가장 근접한 조상 요소를 반환 함.
선택한 요소가 td 안에 없으면 null을 반환함.
table 요소 밖에 td 요소를 선택했으면 return 함.
강조
이벤트 위임 활용하기
save, load, search 기능을 수행하는 버튼을 만든다고 했을때, 메뉴 전체에 핸들러를 하나 추가해주고, 각 버튼의 data-action 속성에 호출할 메서드를 할당해 주는 방법을 사용할 수 있다.
<script> document.addEventListener('click', function(event) { let id = event.target.dataset.toggleId; if (!id) return; let elem = document.getElementById(id); elem.hidden = !elem.hidden; }); </script>