ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฌธ์ œ

์ด๋ฒคํŠธ ์œ„์ž„(Event Delegation)์„ ์œ„ํ•ด ์ตœ์ƒ์œ„ ๋ถ€๋ชจ ์ปจํ…Œ์ด๋„ˆ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์ค„ ๊ฒฝ์šฐ ํ•ด๋‹น ์š”์†Œ ๋‚ด๋ถ€์— ์ž์‹ ์š”์†Œ๋“ค์ด ๋˜ ํ•œ๋ฒˆ ๋ถ€๋ชจ(ParentElem)-์ž์‹(ChildElem) ๊ด€๊ณ„๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๊ณ  ๋‘ ์š”์†Œ๊ฐ€ ๋ ˆ์ด์•„์›ƒ ์ƒ ์™„์ „ํžˆ ๊ฒน์ณ์ ธ ์žˆ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด click ์ด๋ฒคํŠธ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

ParentElem์—์„œ click ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์›น ์ƒ์—์„œ ChildElem์ด wrapper์ธ ParentElem๊ณผ ์œ„์น˜ ๊ฐ’์ด ๊ฒน์ณ์ ธ ์žˆ๊ณ  ํฌ๊ธฐ๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ์—๋Š” ParentElem์ด ์•„๋‹Œ  ChildElem์ด ๊ณ„์†ํ•ด์„œ ์„ ํƒ์ด ๋˜์–ด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.


<div class="leaflet">
        <div class="page" data-page="1">
            <div class="page-face cover-page">
                <p> </p>
                <h1 class="menu-header-title"> /h1>
            </div>
            <div class="page-face">
                    <div class="menu-item">
                        <figure class="menu-item-photo" style="background-image: url(./images/profileImg.JPG);"></figure>
                        <div class="menu-item-info">
                            <p class="member-name"> p>
                            <p class="member-info"> </p>
                        </div>
                        <button class="back-btn"> </button>
                    </div>
            </div>
        </div>
        
        (...)
        
        </div>

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฐ์‹ธ๋Š” container์ธ leaflet ํƒœ๊ทธ์— ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์บก์ณ๋ง(Event Capturing)์„ ํ†ตํ•ด ์›ํ•˜๋Š” ์š”์†Œ์— ๋Œ€ํ•ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ ์ž ํ–ˆ์œผ๋‚˜ ๋ชจ๋“  ์š”์†Œ๋“ค์˜ ๊ฐ™์€ ์œ„์น˜ ๊ฐ’ ๋ฐ ํฌ๊ธฐ ๊ฐ’์ด ๊ฐ™์•„ ์›น ์ƒ์—์„œ ํด๋ฆญํ•˜์˜€์„ ๋•Œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•˜์˜€๋‹ค.

 

๋ฌธ์ œํ•ด๊ฒฐ

์šฐ์„ , getTarget ์ด๋ผ๋Š” ํ•จ์ˆ˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜„์žฌ ์ด๋ฒคํŠธ ๋Œ€์ƒ์ด ๋œ ์š”์†Œ์™€ ์‹ค์ œ ํƒ€๊ฒŸํŒ…๋˜์–ด์•ผ ํ•  ์š”์†Œ์˜ ํด๋ž˜์Šค๋ช…์„ ์ธ์ž๊ฐ’์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

leaflet.addEventListener('click', e => {
        let pageElem = getTarget(e.target, 'page');
 }

getTarget ํ•จ์ˆ˜์—๋Š” ์ธ์ž๋กœ ๋„˜์–ด ์˜จ ์ด๋ฒคํŠธ ๋Œ€์ƒ์ด ๋œ ์š”์†Œ์˜ ํด๋ž˜์Šค๋ช…์ด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธ์ž๊ฐ’์œผ๋กœ ๋„˜์–ด ์˜จ ํƒ€์ผ“ํŒ…์ด ๋˜์–ด์•ผ ํ•  ์š”์†Œ์˜ ํด๋ž˜์Šค๋ช…์„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํ˜„์žฌ ์ฐธ์กฐ๋˜๋Š” ์ด๋ฒคํŠธ ๋Œ€์ƒ์˜ ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ์‹๋ณ„๋˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜์— ์žฌํ• ๋‹นํ•˜์—ฌ ๋‹ค์Œ ๋ฃจํ”„๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค๋ช…์„ ์ง€๋‹Œ ์š”์†Œ๊ฐ€ ์—†์–ด bodyํƒœ๊ทธ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ”๋‹ค๋ฉด null๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ณ  ํ•จ์ˆ˜๋Š” ์ข…๋ฃŒ๋œ๋‹ค.

 

์ „์ฒด์ ์œผ๋กœ ๋ฒ„๋ธ”๋ง(Bubbling)๊ณผ ๋น„์Šทํ•œ ๋™์ž‘ ์›๋ฆฌ์ด์ง€๋งŒ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ํƒ€์ผ“ํŒ… ์˜ˆ์ • ์š”์†Œ ๋˜ํ•œ ์‰ฝ๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

function getTarget(elem, className) {
        while(!elem.classList.contains(className)) {
            elem = elem.parentNode;

            if(elem.nodeName === 'BODY') {
                elem = null;
                return;
            }
        }
        return elem;
    }
๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2024/10   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ