쉽게 이해할 수 있도록 약간 안티패턴이 들어간 방법이긴한데 body end태그 바로 위에 script 넣거나 document DOMContentLoaded 이벤트에 저 코드 넣으면 돼.
설명하면 클래스 search-intro에 있는 div 가져와서, 이벤트에 할당한 value가 falsy한 값이면 해당 엘리먼트에 스타일 태그로 display:block을 넣어서 전부 안보이게, 반대인 경우엔 value랑 일치하는 id를 가진 경우엔 block 아니면 none처리.
const divs = document.body.querySelectorAll('.search-intro>div');
const displayGrade = (value) => {
divs.forEach((el) => {
el.style = !value || el.id === value
? 'display: block;'
: 'display: none';
});
};
쉽게 이해할 수 있도록 약간 안티패턴이 들어간 방법이긴한데 body end태그 바로 위에 script 넣거나 document DOMContentLoaded 이벤트에 저 코드 넣으면 돼.
설명하면 클래스 search-intro에 있는 div 가져와서, 이벤트에 할당한 value가 falsy한 값이면 해당 엘리먼트에 스타일 태그로 display:block을 넣어서 전부 안보이게, 반대인 경우엔 value랑 일치하는 id를 가진 경우엔 block 아니면 none처리.
const divs = document.body.querySelectorAll('.search-intro>div');
const displayGrade = (value) => {
divs.forEach((el) => {
el.style = !value || el.id === value
? 'display: block;'
: 'display: none';
});
};
안티패턴이라고 말한 이유는 저 코드가 엘리먼트 목록 순회하면서 스타일을 직접적으로 바꿔버려서 그런거임.
요소를 하나만 바꾸는게 아니라 여러개를 바꾸는 경우엔 될 수 있는대로 직접적으로 스타일 바꿔서 리페인트나 리플로우가 여러번 일어나는 것 보다는 부모 요소를 클론해서 변경할 자식요소들 한번에 바꿔놓고 부모 요소를 교체하는 방향이 바람직한 편임.
dom 접근은 항상 비용이 많이 드는 작업이란 점을 유의해야해.
아래는 렌더링 최적화 버전
let searchIntro = document.body.querySelector('.search-intro');
const displayGrade = (value) => {
const searchIntroCopy = searchIntro.cloneNode(true);
const divs = searchIntroCopy.querySelectorAll('div');
divs.forEach((el) => {
el.style = el.style = !value || el.id === value
? 'display: block;'
: 'display: none';
});
searchIntro.parentNode.replaceChild(searchIntroCopy, searchIntro);
searchIntro = searchIntroCopy;
};
안티패턴이라고 말한 이유는 저 코드가 엘리먼트 목록 순회하면서 스타일을 직접적으로 바꿔버려서 그런거임.
요소를 하나만 바꾸는게 아니라 여러개를 바꾸는 경우엔 될 수 있는대로 직접적으로 스타일 바꿔서 리페인트나 리플로우가 여러번 일어나는 것 보다는 부모 요소를 클론해서 변경할 자식요소들 한번에 바꿔놓고 부모 요소를 교체하는 방향이 바람직한 편임.
dom 접근은 항상 비용이 많이 드는 작업이란 점을 유의해야해.
아래는 렌더링 최적화 버전
let searchIntro = document.body.querySelector('.search-intro');
const displayGrade = (value) => {
const searchIntroCopy = searchIntro.cloneNode(true);
const divs = searchIntroCopy.querySelectorAll('div');
divs.forEach((el) => {
el.style = el.style = !value || el.id === value
? 'display: block;'
: 'display: none';
});
searchIntro.parentNode.replaceChild(searchIntroCopy, searchIntro);
searchIntro = searchIntroCopy;
};
쉽게 이해할 수 있도록 약간 안티패턴이 들어간 방법이긴한데 body end태그 바로 위에 script 넣거나 document DOMContentLoaded 이벤트에 저 코드 넣으면 돼. 설명하면 클래스 search-intro에 있는 div 가져와서, 이벤트에 할당한 value가 falsy한 값이면 해당 엘리먼트에 스타일 태그로 display:block을 넣어서 전부 안보이게, 반대인 경우엔 value랑 일치하는 id를 가진 경우엔 block 아니면 none처리. const divs = document.body.querySelectorAll('.search-intro>div'); const displayGrade = (value) => { divs.forEach((el) => { el.style = !value || el.id === value ? 'display: block;' : 'display: none'; }); };안티패턴이라고 말한 이유는 저 코드가 엘리먼트 목록 순회하면서 스타일을 직접적으로 바꿔버려서 그런거임. 요소를 하나만 바꾸는게 아니라 여러개를 바꾸는 경우엔 될 수 있는대로 직접적으로 스타일 바꿔서 리페인트나 리플로우가 여러번 일어나는 것 보다는 부모 요소를 클론해서 변경할 자식요소들 한번에 바꿔놓고 부모 요소를 교체하는 방향이 바람직한 편임. dom 접근은 항상 비용이 많이 드는 작업이란 점을 유의해야해. 아래는 렌더링 최적화 버전 let searchIntro = document.body.querySelector('.search-intro'); const displayGrade = (value) => { const searchIntroCopy = searchIntro.cloneNode(true); const divs = searchIntroCopy.querySelectorAll('div'); divs.forEach((el) => { el.style = el.style = !value || el.id === value ? 'display: block;' : 'display: none'; }); searchIntro.parentNode.replaceChild(searchIntroCopy, searchIntro); searchIntro = searchIntroCopy; };