web
[interactive web] Event Handler 리팩토링 - DOM, querySelector 개선
Jaaaay
2022. 8. 21. 20:07
Event Handler 만들 때 주의
<script>
(function () {
const stageElem = document.querySelector(".stage");
// 현재 활성화된 아이템을 저장
function doorHandler(e) {
const targetElem = e.target;
currentItem = document.querySelector(".door-opened");
if (currentItem) {
currentItem.classList.remove("door-opened");
}
if (targetElem.classList.contains("door-body")) {
targetElem.parentNode.classList.add("door-opened");
}
}
stageElem.addEventListener("click", doorHandler);
})();
</script>
위 코드는 DOM 요소를 계속 선택하기 때문에 효율적이지 못하다.
- 리팩토링 1
<script>
(function () {
const stageElem = document.querySelector(".stage");
// 현재 활성화된 아이템을 저장
let currentItem;
function doorHandler(e) {
const targetElem = e.target;
if (currentItem) {
currentItem.classList.remove("door-opened");
}
if (targetElem.classList.contains("door-body")) {
targetElem.parentNode.classList.add("door-opened");
currentItem = targetElem.parentNode;
}
}
stageElem.addEventListener("click", doorHandler);
})();
</script>
변수를 따로 밖에 선언한 후 사용한다.
- 리팩토링 2
<script>
(function () {
const stageElem = document.querySelector(".stage");
// 현재 활성화된 아이템을 저장
let currentItem;
function activate(elem) {
elem.classList.add("door-opened");
currentItem = elem;
}
function inactivate(elem) {
elem.classList.remove("door-opened");
}
function doorHandler(e) {
const targetElem = e.target;
if (currentItem) {
inactivate(currentItem);
}
if (targetElem.classList.contains("door-body")) {
activate(targetElem.parentNode);
}
}
stageElem.addEventListener("click", doorHandler);
})();
</script>
한 함수에 많은 기능이 들어가있기 때문에 함수를 분리해준다. 추후 개선이 용이하다.