UNN4MED
@UNN4MED
Битрикс разработчик

Не удаётся отобразить загружаемый popup при нажатии на карточку. Как решить проблему?

При нажатии на карточку товара должна открыться информация в popup окне.
У карточек есть свой номер и при нажатии он передаётся в функцию, которая строит html-структуру, соответствующую номеру.
Затем построенная структура должна отобразиться, но код не видит построенный html с первого нажатия, а со второго.
Как мне это решить?
Должен быть номер popupа, а оказывает null:
63fbb187c6800521404448.png
Структура html:
<div class="products__cards" id="cakes-cards">
                        <!-- ТОВАРЫ ИЗ JSON (примерно для вопроса)-->
<a data-num="1"  " class="products__card card">
   <h3 class="card__title title">А</h3>
</a>
<a data-num="2"  " class="products__card card">
   <h3 class="card__title title">Б</h3>
</a>
<a data-num="3"  " class="products__card card">
   <h3 class="card__title title">В</h3>
</a>
</div>
<div id="popup" class="popup products-popup">
                        <!-- POPUP ДЛЯ ТОВАРОВ ИЗ JSON -->
</div>

Выгрузка дополнительной информации из json в popup:
function loadPopup(num) {
  // --------------------------POPUP
  $.getJSON('database/products.json', function (data) {
    let out = '';
    out += '<div data-target="' + data[num].id + '" class="popup__wrapper products-popup__wrapper">';
    out += '<span class="products-popup__close icon"></span>';
    out += '<div class="product-popup__body">';
    out += '<div class="product-popup__img image">';
    out += '<img src="' + data[num].image + '" alt="' + data[num]['image'] + '">';
    out += '</div>';
    out += '<div class="product-popup__text">';
    out += '<h2 class="product-popup__title title">' + data[num]['name'] + '</h2>';
    out += '<div class="product-popup__description scrollbar">';
    out += '<p>Вес: ' + data[num]['weight'] + ' кг</p>';
    out += '<p>Тип: ' + data[num]['type'] + '</p>';
    out += '<p>Калорийность: ' + data[num]['calories'] + ' ккал./100 гр.</p>';
    out += '<p>Состав: <br>' + data[num]['compound'] + '</p>';
    out += '<p>Аллергены: ' + data[num]['allergens'] + '</p>';
    out += '</div>';
    out += '<div class="product-popup__bottom">';
    out += '<p class="product-popup__price">Цена: ' + data[num].price + ' р.</p>';
    out += '<button class="product-popup__button button">В корзину<span class="product-popup__icon icon"></span></button>';
    out += '</div>';
    out += '</div>';
    out += '</div>';
    out += '</div>';

    $('#popup').html(out);
  })

Событие при нажатии:
$(document).on("click", ".products__card", (e) => {
  const modalOverlay = document.querySelector(".products-popup");
  let num = e.currentTarget.getAttribute("data-num");
// Число передаётся в функцию, чтоб показать конкретную инфу в popup
  loadPopup(num);
  const modals = document.querySelectorAll(".products-popup__wrapper");
  const target = document.querySelector(`[data-target="${num}"]`);
  console.log(target);
  modals.forEach((modal) => {
    modal.classList.remove("popup__wrapper_active");
  });
  target.classList.add("popup__wrapper_active");
  modalOverlay.classList.add("popup_active");
  document.querySelector("body").classList.add("lock");

  modalOverlay.addEventListener("click", (e) => {
    if (e.target == modalOverlay || e.target.closest('.products-popup__close')) {
      modalOverlay.classList.remove("popup_active");
      document.querySelector("body").classList.remove("lock");
      modals.forEach((modal) => {
        modal.classList.remove("popup__wrapper_active");
      });
    }
  });
});
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
UNN4MED
@UNN4MED Автор вопроса
Битрикс разработчик
Решил, задав setTimeout:
$(document).on("click", ".products__card", (e) => {
  const modalOverlay = document.querySelector(".products-popup");
  let num = e.currentTarget.getAttribute("data-num");
// Число передаётся в функцию, чтоб показать конкретную инфу в popup
  loadPopup(num);
setTimeout(() =>{
  const modals = document.querySelectorAll(".products-popup__wrapper");
  const target = document.querySelector(`[data-target="${num}"]`);
  console.log(target);
  modals.forEach((modal) => {
    modal.classList.remove("popup__wrapper_active");
  });
  target.classList.add("popup__wrapper_active");
  modalOverlay.classList.add("popup_active");
  document.querySelector("body").classList.add("lock");

  modalOverlay.addEventListener("click", (e) => {
    if (e.target == modalOverlay || e.target.closest('.products-popup__close')) {
      modalOverlay.classList.remove("popup_active");
      document.querySelector("body").classList.remove("lock");
      modals.forEach((modal) => {
        modal.classList.remove("popup__wrapper_active");
      });
    }
  });
}, 100);
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
29 нояб. 2024, в 12:12
80000 руб./за проект
29 нояб. 2024, в 11:59
15000 руб./за проект
29 нояб. 2024, в 11:16
40000 руб./за проект