웹 개발을 하다 보면 여러 이벤트가 순차적으로 발생하는 상황을 종종 있다. 이러한 이벤트의 실행 순서를 제대로 이해하면, 이벤트 간의 충돌을 방지하고 원하는 대로 기능을 구현할 수 있다.
마우스 클릭 시 이벤트 실행 순서 알아보기
마우스 클릭 시 이벤트 실행 순서 알아보기
여는글
최근, 검색어를 입력 받아 해당 입력 값에 해당하는 요소를 보여주는 UI 컴포넌트를 만들었다. 이 컴포넌트에서 의도한 동작 과정은 다음과 같다.
- Input 창에 포커스가 가면 해당 input 태그 아래에 자동 완성된 결과물을 보여준다. (focusin 이벤트)
- Input 창에서 포커스가 사라지면 결과물 창을 사라지게 한다. (blur 이벤트)
- 자동 완성된 결과물을 클릭하면 해당 요소의 값이 input의 값으로 들어가게 된다. (click 이벤트)
그러나 결과물을 클릭해도 값이 input에 들어가지 않는 문제가 발생했다. 이는 결과물을 클릭하는 이벤트보다 포커스가 사라지는 이벤트가 더 빨리 실행되기 때문인 듯 했다.
See the Pen clickevent- by ka0824 (@ka0824) on CodePen.
1. 이벤트 실행 순서 알아보기
이벤트의 순서를 알아보기 위해 다음과 같은 코드를 작성했다:
const test1DOM = document.getElementById("test1");
const test2DOM = document.getElementById("test2");
test1DOM.addEventListener("mousedown", (e) => {
console.log("test1 mousedown");
});
test1DOM.addEventListener("focusin", (e) => {
console.log("test1 focusin");
});
test1DOM.addEventListener("mouseup", (e) => {
console.log("test1 mouseup");
});
test1DOM.addEventListener("click", (e) => {
console.log("test1 click");
});
test1DOM.addEventListener("blur", (e) => {
console.log("test1 blur");
});
test2DOM.addEventListener("mousedown", (e) => {
console.log("test2 mousedown");
});
test2DOM.addEventListener("focusin", (e) => {
console.log("test2 focusin");
});
test2DOM.addEventListener("mouseup", (e) => {
console.log("test2 mouseup");
});
test2DOM.addEventListener("click", (e) => {
console.log("test2 click");
});
test2DOM.addEventListener("blur", (e) => {
console.log("test2 blur");
});
이 코드를 통해 알게 된 이벤트 실행 순서는 다음과 같았다.
- mousedown 이벤트
- (다른 요소의) blur 이벤트
- focusin 이벤트
- mouseup 이벤트
- click 이벤트
2. 문제 해결
앞서 작성한 코드에서 자동 완성된 결과물을 선택하더라도 input에 값이 넣어지지 않았던 이유는 해당 요소의 클릭 이벤트 이전에 blur 이벤트가 발생했기 때문이다. blur 이벤트가 발생하면 자동 완성된 요소가 화면에서 사라지게 되어 실제로 클릭 이벤트가 일어나지 않았을 것이다.
따라서, 클릭 이벤트 대신 mousedown 이벤트를 사용하면 원하는 대로 기능을 적용할 수 있다. 이는 mousedown 이벤트가 blur 이벤트보다 먼저 발생하기 때문이다.
3. 문제를 해결한 코드
See the Pen event-order-example-2 by ka0824 (@ka0824) on CodePen.
'컴퓨터 과학 > 웹 개발' 카테고리의 다른 글
[웹] ARIA 속성 알아보기 (0) | 2024.05.08 |
---|---|
웹 페이지는 어떻게 그려지는가? (0) | 2024.04.25 |