별도의 list나 array를 활용하며, class id와 함께 중복선택이 발생하지 않도록 한다.
for(let element of clickAreas){
element.addEventListener('click', (e)=>clickEvent(e));
}
function clickEvent(e) {
//let contentTarget = document.querySelector(e.dataset.tabTarget);
//ntentTarget.classList.add('.display')
//initial state
if(checkList.length == 0){
checkList.push(e.target.id);
e.target.classList.toggle('contentLine');
//click itself
}else if(checkList.length > 0 &&checkList.includes(e.target.id)){
checkList.pop(e.target.id);
e.target.classList.toggle('clickArea');
//click others
}else if(checkList.length > 0 && !(checkList.includes(e.target.id))){
let previousObject = document.getElementById(checkList[0]);
previousObject.classList.toggle('contentLine');
e.target.classList.toggle('contentLine');
checkList.pop();
checkList.push(e.target.id);
}
};
content는 tab의 하위 속성이 아닌, 별도의 content(section)으로 구성한다.
event는 동일한 Event(mouseclick 등)를 활용하되, tab event와는 별도의 logic으로 구성한다.
//tab attributes
let connectTabstoContent = document.querySelectorAll('[data-tab-target]');
let connectContentstoTabs = document.querySelectorAll('[data-tab-content]')
//for content click event
for(let tab of connectTabstoContent){
tab.addEventListener('click', ()=>{
//target = data-tab-content
const target = document.querySelector(tab.dataset.tabTarget);
for(let content of connectContentstoTabs){
content.classList.add('display');
}
target.classList.remove('display');
})
}
}
class를 활용할 경우, 내부적으로 사용하는 변수들은 모두 constructor(생성자)에서 먼저 선언이 되어 있어야 한다.
Tab에 연결되어있는 content에 접근할 수 있는 방법은 두가지를 사용할 수 있다.
data-tab-target을 통한 연결
→ document.querySelectorAll('[data-tab-target]')
을 통해 tab 연결
→ 위 요소 각각에 대해 element.dataset.tabTarget으로 연결된 content로의 접근 가능
Element를 통한 연결
→ document.getElementById
로 tab element 확보
→ 해당 요소에 대해 element.dataset.tabTarget으로 연결된 content로의 접근 가능