Как переключать кнопки и собирать массив?
Здравствуйте. Есть вот такая конструкция: https://jsfiddle.net/gojpc5ru/
последний этап: формирование массива - вроде мне удался, хотя я не уверена, что я всё правильно сделала... может оно не так должно писаться? но вот с кнопкой я не могу. Логика такая:
спотык у меня на моменте, что я дважды должна писать parentNode. Это норм? ну и проблема с отменой класса при нажатии на другой блок. |
зависимые клики по блокам, один активный блок
nastya97core,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
.group {
background: #cccccc;
margin: 20px;
width: min-content;
text-align: center;
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.blocks {
display: flex;
}
p {
flex-basis: 100%
}
.block {
width: 50px;
height: 50px;
margin: 5px;
cursor: pointer;
background: blue;
color: white;
font-size: 24px;
text-align: center;
line-height: 50px;
}
.active {
background: red;
}
.enter {
width: 100px;
height: 50px;
line-height: 50px;
text-align: center;
cursor: pointer;
background: #999999;
margin: 5px
}
</style>
<script>
const array = [];
document.addEventListener("click", ({ target }) => {
const parent = target.closest(".group");
if (!parent) return;
const active = parent.querySelector(".active");
if (target.classList.contains("block")) {
target.classList.toggle("active");
if (active && target != active) active.classList.remove("active");
}
if (target.classList.contains("enter") && active) {
const name = parent.querySelector(".name").textContent;
const activeSize = active.textContent;
active.classList.remove("active");
array.push([name, activeSize])
show.textContent = JSON.stringify(array, "", "");
}
});
</script>
</head>
<body>
<pre id="show"></pre>
<div class="group">
<p class="name">Первый</p>
<div class="blocks">
<div class="block">1</div>
<div class="block">2</div>
<div class="block">3</div>
<div class="block">4</div>
</div>
<div class="enter">Добавить</div>
</div>
<div class="group">
<p class="name">Второй</p>
<div class="blocks">
<div class="block">1</div>
<div class="block">2</div>
<div class="block">3</div>
<div class="block">4</div>
</div>
<div class="enter">Добавить</div>
</div>
<div class="group">
<p class="name">Третий</p>
<div class="blocks">
<div class="block">1</div>
<div class="block">2</div>
<div class="block">3</div>
<div class="block">4</div>
</div>
<div class="enter">Добавить</div>
</div>
</body>
</html>
|
рони,
Спасибо огромное. Я не рассчитывала получить готовый результат, но сильно на это надеялась) У меня ещё один вопрос. Я немного изменила ваш код, но упёрлась в возможное отсутствие объекта
for (let i = 0, count = toCart.length; i < count; i++) {
toCart[i].addEventListener("click", function() {
let parent = this.closest(".info");
let myactive = parent.querySelector(".active-size");
let name = parent.querySelector(".name-item").innerText;
let btnsize = parent.querySelector(".btn-size");
if ((btnsize && myactive) || !btnsize) {
let size = myactive.innerText || false;
addToCart([name, size], this);
myactive.classList.remove("active-size");
} else {
animErrShake(".head-size p");
}
});
}
У меня есть ситуация, когда btnsize может вообще не быть, тогда кнопка должна нажаться и отправить в массив второе значение false. Я делаю
// если есть кнопка и она активна либо если кнопки вообще нет
if ((btnsize && myactive) || !btnsize) {
// и вот здесь myactive может не быть, а я пытаюсь достать из него innerText
// на этом месте у меня как раз и возвращает ошибку
let size = myactive.innerText || false;
вообще вот так у меня работает:
if (btnsize) {
if (myactive) {
let size = myactive.innerText;
addToCart([name, size], this);
myactive.classList.remove("active-size");
} else {
animErrShake(".head-size p");
}
} else {
addToCart([name, false], this);
}
просто тут дважды addToCart вызывается и я думала как-нибудь оптимизировать код. Скажите пожалуйста, что можно сделать с этой строчкой? let size = myactive.innerText || false; |
nastya97core,
не могу помочь, не понимаю описание. |
Цитата:
let size = myactive ? myactive.innerText || false : false; |
| Часовой пояс GMT +3, время: 00:14. |