ํฐ์คํ ๋ฆฌ ๋ทฐ
Question
๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ปจํ ์คํธ ๋ฉ๋ด๊ฐ ๋ํ๋๊ณ , ๋ฉ๋ด๋ฅผ ์ ํํ๊ฑฐ๋ ๊ทธ ์ธ์ ๋ถ๋ถ์ ํด๋ฆญํ๋ฉด ์ฌ๋ผ์ง๋ ํ ์ค๋ฒ ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
Solution
const wrapper = document.querySelector('.wrapper');
const items = document.querySelectorAll('.item');
const contexts = document.querySelectorAll('.context');
function hide(e) {
for(let x of contexts) {
if(x.style.display === 'block') {
x.style.display = 'none';
x.parentNode.classList.remove('open');
}
}
}
function popUp(e) {
event.stopPropagation();
for(let x of contexts) {
if(x.style.display === 'block') {
x.style.display = 'none';
x.parentNode.classList.remove('open');
}
}
e.target.classList.add('open');
const context = e.target.firstElementChild;
context.style.display = 'block';
}
wrapper.addEventListener('click', hide);
items.forEach(item => {item.addEventListener('click', popUp)});
Issue
1. querySelectorAll์ DOM ์ปฌ๋ ์ ๊ฐ์ฒด์ธ NodeList๋ฅผ ๋ฐํํ๋ค. NodeList๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ด๋ฉด์ ์ดํฐ๋ฌ๋ธ์ด๊ธฐ ๋๋ฌธ์ Array.prototype.method()๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
2. HTML ์์ ์ฌ์ด์ ์คํ์ด์ค, ํญ, ์ค๋ฐ๊ฟ(๊ฐํ) ๋ฑ์ ๊ณต๋ฐฑ ๋ฌธ์๋ ํ ์คํธ ๋ ธ๋๋ฅผ ์์ฑํ๋ค. ๊ทธ๋์ ๋ถ๋ชจ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์์
์์๋ฅผ ํ์ํ๊ธฐ ์ํด firstChild๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ์ค๋ฅ ๋ฐ ์์น ์๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค.
์ด๋ฅผ ๋์ ์ firstElementChild๋ฅผ ์ฌ์ฉํ ์ ์๋ค. firstElementChild๋ ํ ์คํธ ๋ ธ๋๋ฅผ ์ ์ธํ๊ณ ์์ ๋ ธ๋๋ง์ ๋ฐํํ๋ค.
3. ์์ ์์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ ์ดํ์ ๋ฐ์ํ๋ ๋ถ๋ชจ ์์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ํด ๋ฐฉํด๋ฐ์ ์ ์๋ค. ์ด๋ ์ด๋ฒคํธ์ ๋ฒ๋ธ๋ง ๋๋ฌธ์
๋ฐ์ํ๋ ํ์์ผ๋ก ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๋ง๊ธฐ ์ํด์๋ ํด๋น ์ฝ๋ฐฑ ํจ์ ๋ด์ stopPropagation()์ ํตํด ๋ฐฉ์งํ ์ ์๋ค.
Refactoring
const wrapper = document.querySelector('.wrapper');
const items = document.querySelectorAll('.item');
wrapper.addEventListener('click', function(e) {
const targetElem = e.target;
event.stopPropagation();
if(!targetElem.classList.contains('item')) return;
targetElem.classList.toggle('open');
items.forEach(function(elem) {
if(elem !== targetElem) elem.classList.remove('open');
})
})
document.body.addEventListener('click', function(e) {
if(e.target.classList.contains('context')) return
items.forEach(function(elem) {
elem.classList.remove('open');
})
})
Issue
1. ๋ชจ๋ ์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด์ฃผ๋ ๊ฒ์ ๊ณผ๋ถํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ณ ์ดํ ์๋กญ๊ฒ ์ถ๊ฐ ๋ ์์์ ์๋ก์ด ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ
๋ฑ๋กํ๋ ๊ฒ ๋ํ ํ๊ณ๊ฐ ์๋ค. ์ด์ ์์ ๋ถ๋ชจ ์์ ๋ ธ๋์๋ง ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด ์ค ๋ค ํ์ ์์ ๋ ธ๋์ ๋ํ ์ด๋ฒคํธ ๊ฐ์ง๋
์บก์ณ๋ง์ ํตํด์ ์ด๋ฃจ์ด ์ง๋๋ก ํ๋ค.
2. classList.add()์ remove()๊ฐ ์๋ toggle() ๋ฉ์๋ ํ๋๋ง์ผ๋ก ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ ๊ธฐ๋ฅ ๊ตฌํ
'JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Infinite Scroll (0) | 2021.07.01 |
---|---|
ScrollSpy_offsetTop, scrollTop, clientHeight (0) | 2021.06.03 |
๋ด์ฅ ํจ์ call์ this ๋ฐ์ธ๋ฉ (0) | 2021.04.17 |
dataset data-id์ ์ด์ฉํด ์ด๋ฒคํธ ์์ (0) | 2021.04.14 |
๋๊ดํธ ํ๊ธฐ๋ฒ์ ํตํ ๊ฐ์ฒด ํ๋กํผํฐ ์ ๊ทผ (0) | 2021.04.07 |