반응형
! 공식문서를 참고해서 개념을 다시 한번 확인해주세요 !
1. 이벤트 버블링 event bubbling
-특정 화면 요소에서 이벤트가 발생했을 때 해당 이벤트가 더 상위의 화면 요소들로 전달되는 이벤트 전파 방식
-가장 아래에 있는 태그에서 이벤트가 발생했을 때 최상위 요소 태그까지 이벤트가 전달됨
-브라우저는 특정 화면 요소에서 이벤트가 발생했을 때 그 이벤트를 최상위에 있는 화면 요소까지 이벤트를 전파시키기 때문에 하위 -> 상위 -> 최상위 순으로 클릭 이벤트가 진행됨
2. 이벤트 캡쳐 event capture
-이벤트 버블링과 반대 방향으로 진행되는 이벤트 전파 방식
-특정 이벤트가 발생했을 때 최상위 요소에서 해당하는 태그를 찾아 내려감
-capture의 default값은 false이기 때문에 capture: true를 설정해줘야 함
ex.
var divs = document.querySelectorAll('div');
divs.forEach(function(div) {
div.addEventListener('click', logEvent, {
capture: true // default 값은 false입니다.
});
});
function logEvent(event) {
console.log(event.currentTarget.className);
}
-최상위->상위->하위 순으로 클릭 이벤트가 진행됨
3. event.stopPropagation()
-원하는 화면 요소의 이벤트만 신경쓰고 싶은 경우에 사용
-이벤트 버블링의 경우 클릭한 요소의 이벤트만 발생시키고 상위 요소로 이벤트를 전달하는 것을 방해
-이벤트 캡처의 경우 클릭한 요소의 최상위 요소의 이벤트만 동작시키고 하위 요소들로 이벤트를 전달하지 않음
4. 이벤트 위임 event delegation
-하위 요소에 각각 이벤트를 붙이지 않고 상위 요소에서 하위 요소의 이벤트들을 제어하는 방식
ex.
html
<h1>오늘의 할 일</h1>
<ul class="itemList">
<li>
<input type="checkbox" id="item1">
<label for="item1">이벤트 버블링 학습</label>
</li>
<li>
<input type="checkbox" id="item2">
<label for="item2">이벤트 캡쳐 학습</label>
</li>
</ul>
js-이벤트 위임 사용 전
var inputs = document.querySelectorAll('input');
inputs.forEach(function(input) {
input.addEventListener('click', function(event) {
alert('clicked');
});
});
input에 이벤트 리스너를 다는 경우 새로운 input을 만들면 거기에는 이벤트가 작동하지 않음
js-이벤트 위임 사용 후
var itemList = document.querySelector('.itemList');
itemList.addEventListener('click', function(event) {
alert('clicked');
});
input의 상위 태그인 ul에 이벤트 리스너를 달아 새로운 input을 만들어도 이벤트 버블링으로 인해 이벤트가 작동함
Resources
반응형
'Learning Log > JavaScript' 카테고리의 다른 글
[javascript] 한 자릿수 날짜 입력 시 두 자리로 만들기 (0) | 2023.06.07 |
---|---|
[javascript] template literal (0) | 2023.01.15 |
[javascript] querySelector, getElementById, getElementsByClassName 차이 (0) | 2023.01.12 |
[javascript] 증감연산자, 복합대입연산자 (1) | 2023.01.06 |
[javascript] Array배열 관련 함수 정리 (0) | 2023.01.06 |