Event Handler = Event Listener = 이벤트 콜백함수
이벤트는 브라우저 입장에서 사용자가 어떤 행동을 하면 어떤 방식으로 처리해주겠다는 로직을 쌓아가는 것이다.
이벤트가 발생했을 때 실행되는 함수를 적어서 연결해주는 것이 '이벤트 핸들러'!
각각의 이벤트에 따라서 여러가지 핸들러를 만드는 것이 목적이다.
⁕ addEventListener( ) (가장 보편적으로 사용하는 메소드)
이벤트가 발생하면,
addEventListener는 세 개의 인자를 가진다.
(ex. element.addEventListener('click', function(e) { }, false); )
<사용자 인터페이스 이벤트>
<Focus 이벤트>
<Form(폼) 이벤트>
<Mouse 이벤트, Keyboard 이벤트>
<Touch 이벤트> (모바일 환경/ MouseEvent와 대체)
이벤트가 어떻게 사용되는 것을 아는 것 뿐만 아니라,
이벤트가 '어떤 식으로 동작'하는지에 대해서 반드시 이해!!!
Event Flow(이벤트 흐름)
html은 항상 중첩 되어 있다.(html ⊃ body ⊃ div...)
div를 클릭했으나 body와 html에도 click 이벤트가 있으면, 도미노처럼 모두 실행된다.
이벤트 탑승되어 부모 관계에 있는 관련된 관계자들은 전원 실행!
⁕ 실행 순서: ① div🎉 ▶ ② body🎉▶ ③ html🎉
↪ 위의 속성은 이벤트 객체가 제공하는 대표적인 공통 property!
예를들어, div를 클릭했는데 html에 있는 핸들러가 실행된다면,
이벤트 핸들러의 주인 'currentTarget'은 html
이 되고,
이벤트가 실행되게 만든 원인 'target'은 div
가 된다.
특정 요소에 이벤트를 실행했는데 다른 요소들도 동일한 이벤트가 있는 경우, '누구 먼저 이벤트를 실행시킬 것이냐'에 대한 문제가 발생하기 때문에 이벤트는 Eventflow를 가진다는 것이다.
➕ 가장 상위 요소(root)는 html
브라우저에서 가장 가까운 요소부터 시작
이벤트가 가장 아래에 있는 상위요소에서 위에 있는 하위요소로 올라가 전파함
이벤트가 시작된 진짜 주인의 이벤트가 실행
이벤트가 하위요소에서 상위요소로 밑으로 내려와 전파함
위의 세 단계를 그리면 부메랑 형태를 띈다.
Event flow는 '캡-타-버' 순으로 흐르며, 정해진 순서로 바꿀 수 없다!!
부메랑 형태로 이벤트가 실행되면 중복으로 실행되는 문제가 발생되어 브라우저는 제약을 둔다.
즉, currentTarget과 target이 일치하지 않는 경우, Capture phase와 Bubble phase 중 발생될 곳을 선택할 수 있다.
(event flow phase 중 어느 단계에서 실행되고 싶은지를 선택함)
브라우저의 기본값은 bubble로 설정되어 있다. (대부분이 bubble)
div를 클릭했는데 html이 먼저 실행되지 않고, 실행 되길 원하는 div를 클릭해 먼저 실행될 수 있도록 하는 것이 합리적이라고 생각한다.
capture일 때 혹은 bubble일 때 실행되지 않고 클릭한 요소만 실행되도록 하고자 할 때 사용하는 메서드이다.
일단 브라우저의 기본 행태이기 때문에 브라우저의 '이벤트가 캡쳐 단계에서 버블 단계로 돌아오는 흐름'은 절대 막을 수 없다.
그러나 전파하는 것은 막을 수 있다! 이벤트를 컨트롤 할 수 있다!
e.stopPropagation()
이 선언된 요소 기준 이후에 (원래 실행되기로 한 phase) 전파되는 것을 멈추라는 의미이다.
이벤트 핸들러를 달면 브라우저는 무조건 '이벤트 객체'라는 것을 넣어 준다. (무조건 약속!🤝)
이벤트 객체는 보통 'e, evt, event'라는 이름으로 많이 쓰인다.
브라우저가 이벤트 객체를 항상 보내줄테지만 필요 없다면 쓰지 않으면 된다.
이벤트 객체(= 해당 이벤트와 연관된 정보를 모은 것)는 이벤트의 종류에 따라서 달라지는데 이벤트 객체에서 오는 속성과 메서드들이 조금씩 달라진다.
➕ 태그 안에 원하는 정보가 (value가 아니라) text라면 실질적인 정보가 필요하기 때문에 이벤트 객체(e)의 도움을 받을 수 밖에 없다.
★ 이벤트에 공통적으로 들어가는 메서드나 속성!
⁕ 'DOM을 깨우치다' 책과 김버그님 영상을 참고함