Как при нажатии кнопки открыть блок, относящийся к этой кнопке

Есть карточки, в них кнопка "детали". Как при нажатии на кнопку открыть лишь блок относящийся к определенной кнопке в этой карточке?

let toggleA = document.querySelectorAll(".card_button");

let detailCard = document.querySelectorAll(".card_text");

function openCloseDetails() {
  if (a == 0) {

    detailCard.style.display = "block";
    return (a = 1);
  } else {
    detailCard.style.display = "none";

    return (a = 0);
  }
};

toggleA.addEventListener("click", openCloseDetails);
.card {
    margin-bottom: 15px;
   border:2px solid black;
    border-radius: 15px;

         display: flex;
         flex-direction: column;
         justify-content: space-between;
         padding: 10px;
}

.card_button {
    width: 90px;
    border: 1px solid black;
    border-radius: 10px;
    display: block;
    margin: 5px;
    margin-left: auto;
    padding: 5px 10px;
    text-decoration: none; */
    color: #000;
}

.card_button:hover {
    box-shadow: 0 0 5px rgba(0,0,0,0.3);
    background: linear-gradient(to bottom, #fcfff4, #e9e9ce);
    }
<div class="wrapper">
  <div class="card">
    this any card
    <a href="#" class="card_button">Детали</a>
    <div class="card_text" style="display: none">text for first card</div>
  </div>
  <div class="card">
    this any card
    <a href="#" class="card_button">Детали</a>
    <div class="card_text" style="display: none">text for second card</div>
  </div>
  <div class="card">
    this any card
    <a href="#" class="card_button">Детали</a>
    <div class="card_text" style="display: none">text for third card</div>
  </div>
  <div class="card">
    this any card
    <a href="#" class="card_button">Детали</a>
    <div class="card_text" style="display: none">text for fourth card</div>
  </div>
  </div

Не срабатывает, так как в toggleA массив кнопок. Понимаю, что нужно поменять стиль именно у того номера массива которая была нажата. Не понимаю как это сделать... Подскажите пожалуйста!


Ответы (1 шт):

Автор решения: Pavel Nazarian

Можно использовать делегирование событий, чтобы не вешать слушатель на каждую кнопку. https://learn.javascript.ru/event-delegation

Также можно для удобства использовать атрибут hidden (https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/hidden). И при нажатии инвертировать его значение - показать/скрыть.

Код ниже:

function openCloseDetails(event) {
  if (event.target.classList.contains('card_button')){  
    let card_text = event.target.closest('.card').querySelector('.card_text');
    card_text.hidden = !card_text.hidden;
  }
};

document.querySelector('.wrapper').addEventListener("click", openCloseDetails);
.card {
    margin-bottom: 15px;
   border:2px solid black;
    border-radius: 15px;

         display: flex;
         flex-direction: column;
         justify-content: space-between;
         padding: 10px;
}

.card_button {
    width: 90px;
    border: 1px solid black;
    border-radius: 10px;
    display: block;
    margin: 5px;
    margin-left: auto;
    padding: 5px 10px;
    text-decoration: none; */
    color: #000;
}

.card_button:hover {
    box-shadow: 0 0 5px rgba(0,0,0,0.3);
    background: linear-gradient(to bottom, #fcfff4, #e9e9ce);
    }

<div class="wrapper">
<div class="wrapper">
  <div class="card">
    this any card
    <a href="#" class="card_button">Детали</a>
    <div class="card_text" hidden>text for first card</div>
  </div>
  <div class="card">
    this any card
    <a href="#" class="card_button">Детали</a>
    <div class="card_text" hidden >text for second card</div>
  </div>
  <div class="card">
    this any card
    <a href="#" class="card_button">Детали</a>
    <div class="card_text" hidden>text for third card</div>
  </div>
  <div class="card">
    this any card
    <a href="#" class="card_button">Детали</a>
    <div class="card_text" hidden>text for fourth card</div>
  </div>
  </div>

→ Ссылка