Ниже — очень короткий код, который сортирует каждый диапазон в новый массив в зависимости от имеющегося у него className.
Что у меня сейчас есть: как только наводится курсор на квадрат указанного class, ОНО ПОЛУЧАЕТ уникальный для своего class цвет.
Чего мне нужно было добиться: Как только наводится один из указанных class - ВСЕ classList ПРЕДМЕТЫ ПОЛУЧАЮТ уникальный цвет своего class.
Может кто-нибудь сказать мне, что не так в коде ниже? Спасибо!
let allDivs = [...document.querySelectorAll(`div`)];
let Classes = [ "A0", "A1", "A2", "A3" ];
console.info(`let 'allDivs' equals:`);
console.info(allDivs);
for (let i = 0; i < Classes.length; i++) {
let allDivsFiltered = allDivs.filter(item => (item.className.match(`A${i}`)));
console.info('---- ---- ---- ----');
console.info(`let 'allDivsFiltered [${i}]' equals:`);
console.info(allDivsFiltered);
// allDivsFiltered.classList.add(`B${i}`); // THIS DOESN'T WORK;
for (let all of allDivsFiltered) {
all.onmouseover = () => {
all.classList.add(`B${i}`); // This does work,
// but seperately on each one;
// allDivsFiltered.classList.add(`B${i}`); // DOESN'T WORK HERE
// AS WELL;
};
console.info(all);
};
};body {
display: flex;
flex-wrap: wrap;
}
div[class^ = "A"] {
position: relative;
background-color: slategray;
width: 100px;
height: 100px;
top: 0px;
left: 0px;
margin-top: 4px;
margin-left: 4px;
}
div[class^ = "A"].B0 {
background-color: red;
}
div[class^ = "A"].B1 {
background-color: blue;
}
div[class^ = "A"].B2 {
background-color: green;
}
div[class^ = "A"].B3 {
background-color: yellow;
}<div class = "A0"></div>
<div class = "A0"></div>
<div class = "A0"></div>
<div class = "A1"></div>
<div class = "A1"></div>
<div class = "A2"></div>
<div class = "A2"></div>
<div class = "A3"></div>
<div class = "A3"></div>Мне интересно, почему бы и нет document.querySelectorAll(`div.${Classes[i]}`);
Ох, пробовал, но не получается @Wyck
Спасибо большое, это ответ!!! @Фил
другой подход заключается в использовании умного CSS :has(.A0.active) .A0 { background-color: red;} — тогда, если какой-либо из .A0 также .active, то все .A0 получат этот фон



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно будет зациклить allDivsFiltered в обработчике наведения курсора мыши и добавить класс к каждому из них. Сейчас вы добавляете класс только к наведенному элементу.
Я бы организовал код немного по-другому, группируя каждую отфильтрованную коллекцию и добавляя общий класс для обозначения наведенного/активного состояния.
const classes = ['A0', 'A1', 'A2', 'A3'];
const elements = classes.reduce(
(map, c) => map.set(c, document.querySelectorAll(`.${c}`)),
new Map(),
);
document.addEventListener('mouseover', ({ target }) => {
target.classList.forEach((c) => {
elements.get(c)?.forEach((e) => e.classList.add('active'));
});
});body {
display: flex;
flex-wrap: wrap;
}
div {
position: relative;
background-color: slategray;
width: 100px;
height: 100px;
top: 0px;
left: 0px;
margin-top: 4px;
margin-left: 4px;
}
.A0.active {
background-color: red;
}
.A1.active {
background-color: blue;
}
.A2.active {
background-color: green;
}
.A3.active {
background-color: yellow;
}<div class = "A0"></div>
<div class = "A0"></div>
<div class = "A0"></div>
<div class = "A1"></div>
<div class = "A1"></div>
<div class = "A2"></div>
<div class = "A2"></div>
<div class = "A3"></div>
<div class = "A3"></div>Ох, и большое спасибо за дополнительный код!
Вы почти у цели. Просто прокрутите allDivsFiltered, чтобы добавить или удалить класс.
Я также упростил ваш запрос до одного шага.
let Classes = ["A0", "A1", "A2", "A3"];
Classes.forEach((className, i) => {
let allDivsFiltered = document.querySelectorAll(`div.${className}`);
allDivsFiltered.forEach(div => {
div.onmouseover = () => {
allDivsFiltered.forEach(div => div.classList.add(`B${i}`));
};
div.onmouseout = () => {
allDivsFiltered.forEach(div => div.classList.remove(`B${i}`));
};
});
});body {
display: flex;
flex-wrap: wrap;
}
div {
position: relative;
background-color: slategray;
width: 100px;
height: 100px;
top: 0px;
left: 0px;
margin-top: 4px;
margin-left: 4px;
}
.B0 {
background-color: red;
}
.B1 {
background-color: blue;
}
.B2 {
background-color: green;
}
.B3 {
background-color: yellow;
}<div class = "A0"></div>
<div class = "A0"></div>
<div class = "A0"></div>
<div class = "A1"></div>
<div class = "A1"></div>
<div class = "A2"></div>
<div class = "A2"></div>
<div class = "A3"></div>
<div class = "A3"></div>Думаю вместо add toggle подойдет.
let allDivs = [...document.querySelectorAll(`div`)];
let classes = [ "A0", "A1", "A2", "A3" ];
classes.forEach(className => {
const elementsWithClass = document.querySelectorAll(`.${className}`);
elementsWithClass.forEach(element => {
element.addEventListener('mouseover', () => {
elementsWithClass.forEach(element => element.classList.toggle(`B${className.slice(1)}`));
});
element.addEventListener('mouseout', () => {
elementsWithClass.forEach(element => element.classList.remove(`B${className.slice(1)}`));
});
});
});body {
display: flex;
flex-wrap: wrap;
}
div {
position: relative;
background-color: slategray;
width: 100px;
height: 100px;
top: 0px;
left: 0px;
margin-top: 4px;
margin-left: 4px;
}
.B0 {
background-color: red;
}
.B1 {
background-color: blue;
}
.B2 {
background-color: green;
}
.B3 {
background-color: yellow;
}<div class = "A0"></div>
<div class = "A0"></div>
<div class = "A0"></div>
<div class = "A1"></div>
<div class = "A1"></div>
<div class = "A2"></div>
<div class = "A2"></div>
<div class = "A3"></div>
<div class = "A3"></div>
Вам нужно будет зациклить
allDivsFilteredв обработчике наведения курсора мыши и добавить класс к каждому из них. Сейчас вы добавляете класс только к наведенному элементу.