Вы можете значительно упростить логику, используя вместо этого classList.toggle
.Вы также можете использовать querySelectorAll
, который вы можете forEach
напрямую:
document.querySelectorAll('button').forEach(btn => {
btn.addEventListener('click', () => {
btn.classList.toggle('selected');
});
});
button {
outline: none;
border: none;
padding: 3px 7px;
color: #FF4A3F;
background: #E7E7E7;
font: 500 16pt calibri;
transform: scale(1, 0.95);
}
.selected {
background: #353553;
color: white;
}
<button>Home</button>
<button>Admission</button>
<button>Results</button>
<button>Curriculum</button>
<button>Contact us</button>
Проблема с вашим исходным кодом заключается в том, что push
не возвращает массив;вместо этого он возвращает длину массива, поэтому он не является цепным (к сожалению).То же самое с pop()
.
Настройка вашего кода, чтобы он работал, при условии , что последний className
всегда будет selected
, будет выглядеть так:
window.onload = function() {
const [...btns] = document.getElementsByTagName('button');
for(let i = 0; i < btns.length; i++) {
btns[i].addEventListener('click', function() {
const classNameArr = this.className.split(' ');
if(classNameArr.indexOf('selected') > -1) {
classNameArr.pop();
this.className = classNameArr.join(' ');
} else {
classNameArr.push('selected')
this.className = classNameArr.join(' ');
}
console.log(this.className);
});
}
}
button {
outline: none;
border: none;
padding: 3px 7px;
color: #FF4A3F;
background: #E7E7E7;
font: 500 16pt calibri;
transform: scale(1, 0.95);
}
.selected {
background: #353553;
color: white;
}
<button>Home</button>
<button>Admission</button>
<button>Results</button>
<button>Curriculum</button>
<button>Contact us</button>