#javascript #loops
#javascript #циклы
Вопрос:
Я могу найти примеры с использованием jQuery, но я не могу найти ответы, как это сделать в чистом JavaScript.
Возможно ли объединить эти два цикла классов с помощью JavaScript для упрощения кода. В итоге у меня будет около 20 классов для проекта, над которым я работаю.
var srtClass1 = document.getElementsByClassName('class1');
for(var i = 0; i < srtClass1.length; i ) {
srtClass1[i].classList.add('newClass');
srtClass1[i].classList.remove('class1');
}
var srtClass2 = document.getElementsByClassName('class2');
for(var i = 0; i < srtClass2.length; i ) {
srtClass2[i].classList.add('newClass');
srtClass2[i].classList.remove('class2');
}
Комментарии:
1. Чего вы хотите достичь конкретно? Добавить X классов к X элементам?
Ответ №1:
Вы могли бы попробовать что-то вроде этого. Вам просто нужно заполнить массив всеми классами, которые вы хотите удалить.
var classes = ['.class1', '.class2', '.class3'];
var elements = document.querySelectorAll(classes.join(','));
for (let element of elements) {
element.classList.add('newClass');
for (let className in classes) {
element.classList.remove(className);
}
}
.box {
display: block;
width: 100%;
height: 20px;
margin: 0 0 20px 0;
}
.class1 { background: red; }
.class2 { background: green; }
.class3 { background: blue; }
.newClass { background: yellow; }
<div class="box class1"></div>
<div class="box class2"></div>
<div class="box class3"></div>
Комментарии:
1. @Devlin это работает, за исключением второй части, исходный класс не удаляется. Спасибо за это. Если бы вы могли помочь с удалением classx, это было бы здорово. Тем временем я попытаюсь разобраться с этой частью.
2. Я разобрался с этим. Мне нравится, когда людям нравятся те, кто добавил решения по этому вопросу, спасибо вам всем. const classes = [‘.class1’, ‘.class2’, ‘.class3’]; const elements = документ. querySelectorAll(classes.join(‘,’)); const classNames = [‘class1’, ‘class2’, ‘class3’]; console.log(элементы); console.log(имена классов); для (пусть элемент элементов) { element.classList.add(‘NewClass’); для (пусть className имен классов) { element.classList.remove(className); } }
Ответ №2:
Вы можете объединить 2 коллекции:
var srtClass1 = [...document.getElementsByClassName('class1'), ...document.getElementsByClassName('class2')];
for(var i = 0; i < srtClass1.length; i ) {
srtClass1[i].classList.add('newClass');
srtClass1[i].classList.remove('class1');
srtClass1[i].classList.remove('class2');
}
И вы можете использовать функции более высокого порядка:
[...document.getElementsByClassName('class1'), ...document.getElementsByClassName('class2')].forEach( el => {
el.classList.add('newClass');
el.classList.remove('class1');
el.classList.remove('class2');
});
И даже лучше (поскольку classList.remove
поддерживает несколько аргументов):
[...document.getElementsByClassName('class1'), ...document.getElementsByClassName('class2')].forEach( el => {
el.classList.add('newClass');
el.classList.remove('class1', 'class2');
});
Или, если вы хотите, вы можете использовать querySelectorAll
:
document.querySelectorAll('.class1, .class2').forEach(el => {
el.classList.add('newClass');
el.classList.remove('class1', 'class2');
});
Ответ №3:
Возможно, попробуйте составить список классов, а затем повторить его вместо этого:
function changeClasses() {
let classNames = ['class1', 'class2'];
classNames.forEach(className => {
const node = document.querySelector(`.${className}`);
if (node != null) {
node.classList.add('newClass');
node.classList.remove(className);
}
});
}
.class1 {
color: green;
}
.class2 {
color: blue;
}
.newClass {
color: red;
}
<body>
<div class="class1">class1</div>
<div class="class2">class2</div>
<button onclick="changeClasses()">Change classes</button>
</body>