var useCapture = true; var order = document.getElementById("order"); var toggle = null; // 익명함수를 가리킬 전역변수 (toggle = function(t) { var a = document.getElementById('A'); var b = document.getElementById('B'); var c = document.getElementById('C'); useCapture = !useCapture; // 캡쳐 순서를 바꾼다 시작이 버블링 order.innerHTML = "" // 이벤트를 지운다 이벤트 처리 함수가 명시적이아야 삭제 가능 a.removeEventListener('click', printA); b.removeEventListener('click', printB); c.removeEventListener('click', printC); // 이벤트를 등록한다. a.addEventListener('click', printA, useCapture); b.addEventListener('click', printB, useCapture); c.addEventListener('click', printC, useCapture); var output = document.getElementById('output'); if (useCapture) { output.innerHTML = "캡쳐링"; } else { output.innerHTML = "버블링"; } c.click(); // 클릭을 시물레이션한다. })(); function printA(event) { clear(event); order.innerHTML += " A"; } function printB(event) { clear(event); order.innerHTML += " B"; } function printC(event) { clear(event); order.innerHTML += " C"; } // 문자열이 일정길이 이상이면 지운다. var preTarget = ""; function clear(event) { var len = 0; switch (event.target.id) { case 'A': len = 1; break; // A 클릭시 1개만 찍히게 함 case 'B': len = 3; break; // B 클릭시 2개만 찍히게 함 case 'C': len = 5; break; // 3개 모두 출력 } // 이전 타겟과 다르면 기존내용을 지우고 새로 출력 if ((event.target.id != preTarget) || (order.innerHTML.length > len)) { order.innerHTML = ""; } preTarget = event.target.id; }
<div id="A" class="layer"> <span>A</span> <div id="B" class="layer"> <span>B</span> <div id="C" class="layer"> <span>C</span>클릭!</div> </div> </div> <p> <button type="button" onclick="toggle()">전파방식 토글</button> </p> <P><span id="output">버블링</span> 전파 순서 :<span id="order"></span> </P>
#A { background-color: #949dcf; width: 200px; height: 200px; } #B { background-color: #c0db79; width: 150px; height: 150px; } #C { background-color: #f9a830; width: 100px; height: 100px; box-sizing: border-box; line-height: 100px; text-align: center; } .layer { position: relative; } .layer > span { position: absolute; left: 10px; bottom: 10px; line-height: initial; font-size: 1.8em; font-weight: bold; color: white; }