• Evnet Capturing : 넷스케이프, 거의 사용하지 않는다.
  • Event Bubbling : MS, 사용을 많이 한다.

1. Evnet Capturing

  • EVENT_TAGET.addEventListener(EVENT_TYPE, EVENT_HANDLER, true);
  • 부모노드에서 자식노드로 이벤트가 전파
  • 자식을 클릭하면 최상단 부모가 이벤트 핸들러가 실행되고 그 다음 자식에 이벤트가 실행
<div class="parent">
    <button type="button">1</button>
    <button type="button">2</button>
    <button type="button">3</button>
    <button type="button">4</button>
</div>

2. Event Bubbling

  • EVENT_TAGET.addEventListener(EVENT_TYPE, EVENT_HANDLER, false);

    EVENT_TAGET.addEventListener(EVENT_TYPE, EVENT_HANDLER); false 기본값

  • 자식노드부터 이벤트가 발생하여 부모로 이벤트가 전파
  • 이벤트 타켓(본인) -> 바로 부모에 이벤트 실행 (최상단 부모까지)
<div id="first">first
    <div id="second">second
        <div id="third">third</div>
    </div>
</div>
// Capturing 실행되고 Bubbling 나중에 된다
var first = document.querySelector('#first');
var second = document.querySelector('#second');
var third = document.querySelector('#third');

var allElements = [first, second, third];

function setEventCapturing(index) {
    allElements[index].addEventListener('click', function() {
        console.log('capturing:' + allElements[index].id);
    }, true);
}

function setEventBubbling(index) {
    allElements[index].addEventListener('click', function(event) {
        console.log(event.type); // click
        console.log('bubbling:' + allElements[index].id);
    });
}

for(var i = 0; i < allElements.length; i++) {
    setEventCapturing(i);
    setEventBubbling(i);
}
// for문안에 addEventListener 넣을 경우
// i가 최종 가리키는 4번째 값이 없기 때문에 (undefined)에러가 난다
for(var i = 0; i < allElements.length; i++) {
    allElements[i].addEventListener(function(e) {
        console.log('capturing:' + allElements[i].id);
    }, true);
}