๊ฐœ๋ฐœ ๐Ÿพ/JavaScript

๋‚˜ ์ž์‹ ์ด์™ธ์— ํด๋ฆญ ํ•˜๋ฉด .. ! (feat. ์…€๋ ‰ํŠธ ๋ฐ•์Šค ์ปค์Šคํ…€ ์—ฐ์žฅ์„ )

JOTOKKI 2021. 10. 22. 13:10
728x90

๊ธฐ์กด์— ํฌ์ŠคํŒ…๋˜์—ˆ๋˜ ๊ธ€ ์ค‘  select ํƒœ๊ทธ ์ปค์Šคํ…€ ํ•˜๊ธฐ, ํ˜น์€ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ (feat. javascript)

์ž์‹ ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ํด๋ฆญํ•  ๋•Œ ๋‹ซํžˆ๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์งˆ๋ฌธ์„ ์ฃผ์…”์„œ ๋”ฐ๋กœ ๋‹ค๋ฃจ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ์ƒˆ๋กœ ํฌ์ŠคํŒ…์„ ํ•ด๋ด…๋‹ˆ๋‹ค. 

 

๊ผญ SelectBox์—๋งŒ ์‚ฌ์šฉ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ˆ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

 

 

๐Ÿ’œ ์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์„œ ์ง€์นญํ•˜๋Š” selectbox๋Š” html ํƒœ๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ div๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋œ selectbox๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 

๐Ÿ’œ ๊ธฐ์กด ์†Œ์Šค๋ฅผ ๋ณด์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ๋” ํŽธํ•˜์‹ค ๊บผ์˜ˆ์š”.๐Ÿ˜‰

 

์›๋ฆฌ๋Š” window ์ž์ฒด์— addeventListener๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํด๋ฆญ๋œ event ๊ฐ’์„ ๋ฐ›์•„์„œ ๋น„๊ต๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ํด๋ฆญ๋œ event.target์ด Select ์ž์‹ ์ธ์ง€ ์•„๋‹Œ์ง€ ๋น„๊ตํ•œ ๋’ค ๋ณธ์ธ์ด ์•„๋‹ˆ๋ฉด Select๋ฅผ ๋‹ซ์•„์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

1. window ์— addeventListener ๊ฑธ๊ธฐ

window.addEventListener('click', e => ๋น„๊ตํ•ด์„œ๋‹ซ์„ํ•จ์ˆ˜(e))

 

2. ๋น„๊ตํ•ด์„œ Select๋ฅผ ๋‹ซ์•„์ฃผ๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

e.target ์—์„œ class๊ฐ’์„ ๊ฐ€์ ธ์™€ label์ด๋‚˜ optionItem ์„ ํด๋ฆญํ•˜๋Š”๊ฒฝ์šฐ๋Š” ๋‹ซํžˆ๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ ์ด ๋‘๊ฐ€์ง€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋ฌด์กฐ๊ฑด Select๋ฅผ ๋‹ซ์•„์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

const handleClose = e => {
    // select ๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ ๋‹ซ๊ธฐ 
    if(!e.target.classList.contains('label') && !e.target.classList.contains('optionItem')) {
        label.forEach(function(lb){
            lb.parentNode.classList.remove('active')
        })
    } 
}

 

 

PLUS. ๋ฉ€ํ‹ฐ selectbox์—์„œ ๋‚˜ ์ž์‹ ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์— ๋‹ซ๊ธฐ 

์ถ”๊ฐ€์ ์œผ๋กœ selectbox๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ๊ฒฝ์šฐ์˜ ์†Œ์Šค ์ฝ”๋“œ๋„ ์ถ”๊ฐ€๋ฌ์—ˆ๋Š”๋ฐ, 

์ด๋•Œ selecbox๋ฅผ ์—ด์–ด๋†“์€ ์ƒํƒœ๋กœ ๋‹ค๋ฅธ selectbox๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ ๋‹ค๋ฅธ ์—ด๋ ค ์žˆ๋Š” selectbox๋ฅผ ๋‹ซ์•„์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ๋” ์ถ”๊ฐ€ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. label์„ forEach๋กœ ๋Œ๋ ค ํด๋ฆญ๋œ label์ด ์•„๋‹ˆ๋ฉด ๋ถ€๋ชจ๋ฅผ ์ฐพ์•„ active ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. 

const clickLabel = (lb, optionItems) => {

    // ****************** ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„ START
    // ๋‚ด๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ select ๋‹ซ๊ธฐ 
    label.forEach(function(itemLb){
        if(lb !== itemLb) {
            itemLb.parentNode.classList.remove('active')
        }
    })
    // ****************** ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„ END

    if(lb.parentNode.classList.contains('active')) {
        lb.parentNode.classList.remove('active');
        optionItems.forEach((opt) => {
            opt.removeEventListener('click', () => {
                handleSelect(lb, opt)
            })
        })
    } else {
        lb.parentNode.classList.add('active');
        optionItems.forEach((opt) => {
            opt.addEventListener('click', () => {
                handleSelect(lb, opt)
            })
        })
    }
}

 

 


์ตœ์ข…์ฝ”๋“œ

 

๋ฐ˜์‘ํ˜•