Как запустить модальное окно Javascript в цикле?

Вопрос или проблема

Итак, у меня есть это всплывающее модальное окно:

HTML:

<h2>Пример модального окна</h2>

<!-- Триггер/Открыть модальное окно -->
<button id="myBtn">Открыть модальное окно</button>

<!-- Модальное окно -->
<div id="myModal" class="modal">

  <!-- Содержимое модального окна -->
  <div class="modal-content">
    <span class="close">&times;</span>
    <p>Некоторый текст в модальном окне..</p>
  </div>

</div>

Скрипт:

<script>
// Получить модальное окно
var modal = document.getElementById("myModal");

// Получить кнопку, которая открывает модальное окно
var btn = document.getElementById("myBtn");

// Получить элемент <span>, который закрывает модальное окно
var span = document.getElementsByClassName("close")[0];

// Когда пользователь нажимает на кнопку, открыть модальное окно 
btn.onclick = function() {
  modal.style.display = "block";
}

// Когда пользователь нажимает на <span> (x), закрыть модальное окно
span.onclick = function() {
  modal.style.display = "none";
}

// Когда пользователь нажимает в любое место за пределами модального окна, закрыть его
window.onclick = function(event) {
  if (event.target == modal) {
    modal.style.display = "none";
  }
}
</script>

Я пытаюсь вставить цикл для каждого поста.

Он работает на первом посте, но не всплывает для остальных.

Я попытался вынести скрипт за пределы цикла, та же самая ситуация… работает для первого поста, но не для остальных.

Думаю, конфликт возникает из-за имен.

Можно ли сделать так, чтобы это работало в цикле для каждого поста?

Любая помощь будет оценена.

ИЗМЕНЕНИЕ: Я попытался добавить <?php $postid = get_the_ID(); echo $postid; ?>, чтобы я мог задать уникальный id для каждого случая в цикле.

Но это не сработало (даже для первого поста).

Думаю, PHP не исполнился в некоторых частях скрипта.

Мне действительно нужна помощь, как это решить?

Решение с использованием всплывающего окна без JavaScript:

Добавил <?php $postid = get_the_ID(); echo $postid; ?> в HTML, чтобы он действовал как уникальный id для каждого поста в цикле.

HTML:

<a href="#openModal<?php $postid = get_the_ID(); echo $postid; ?>">Открыть модальное окно</a>

<div id="openModal<?php $postid = get_the_ID(); echo $postid; ?>" class="modalDialog">
  <div>
    <a href="#close" title="Close" class="close">X</a>
    <h2>Всплывающее окно</h2>
    <p>Это красивая всплывашка, работающая только с CSS3.</p>
  </div>
</div>

CSS:

.modalDialog {
  position: fixed;
  font-family: Arial, Helvetica, sans-serif;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: rgba(0, 0, 0, 0.8);
  z-index: 99999;
  opacity: 0;
  -webkit-transition: opacity 400ms ease-in;
  -moz-transition: opacity 400ms ease-in;
  transition: opacity 400ms ease-in;
  pointer-events: none;
}
.modalDialog:target {
  opacity: 1;
  pointer-events: auto;
}
.modalDialog > div {
  width: 400px;
  position: relative;
  margin: 10% auto;
  padding: 5px 20px 13px 20px;
  border-radius: 10px;
  background: #fff;
  background: -moz-linear-gradient(#fff, #999);
  background: -webkit-linear-gradient(#fff, #999);
  background: -o-linear-gradient(#fff, #999);
}
.close {
  background: #606061;
  color: #FFFFFF;
  line-height: 25px;
  position: absolute;
  right: -12px;
  text-align: center;
  top: -10px;
  width: 24px;
  text-decoration: none;
  font-weight: bold;
  -webkit-border-radius: 12px;
  -moz-border-radius: 12px;
  border-radius: 12px;
  -moz-box-shadow: 1px 1px 3px #000;
  -webkit-box-shadow: 1px 1px 3px #000;
  box-shadow: 1px 1px 3px #000;
}
.close:hover {
  background: #00d9ff;
}

Ответ или решение

Для решения задачи, связанной с отображением JavaScript модального окна в цикле на каждой публикации, необходимо уделить внимание уникальности идентификаторов каждого модального окна и кнопки открытия. Когда все модальные окна имеют одинаковый идентификатор, JavaScript срабатывает только для первого элемента. Давайте разберем шаги для корректной реализации.

Шаги для реализации модального окна в цикле

1. Создание уникальных идентификаторов

Первый и самый важный шаг — убедиться, что каждая модальная форма и кнопка, открывающая её, имеют уникальные идентификаторы. Для этого будем использовать PHP для внедрения уникального идентификатора, например идентификатора поста.

Обновите вашу HTML-разметку следующим образом:

<?php $postId = get_the_ID(); ?>

<button id="myBtn-<?php echo $postId; ?>">Open Modal</button>

<div id="myModal-<?php echo $postId; ?>" class="modal">
  <div class="modal-content">
    <span class="close">&times;</span>
    <p>Some text in the Modal..</p>
  </div>
</div>

2. Модификация JavaScript кода

После того как у нас есть уникальные идентификаторы, нужно изменить JavaScript для поддержки таких изменений:

document.querySelectorAll('[id^="myBtn-"]').forEach(button => {
  button.onclick = function() {
    const postId = this.id.split('-')[1];
    const modal = document.getElementById("myModal-" + postId);
    modal.style.display = "block";

    const span = modal.querySelector('.close');
    span.onclick = function() {
      modal.style.display = "none";
    }

    window.onclick = function(event) {
      if (event.target == modal) {
        modal.style.display = "none";
      }
    }
  }
});

Заключение

Такая реализация обеспечивает работу модальных окон для каждого элемента в вашем цикле. Использование уникальных идентификаторов, генерируемых на серверной стороне с помощью PHP, позволяет успешно различать модальные окна и кнопки в JavaScript, что решает проблему ввиде конфликта идентификаторов.

Вынесение дополнительной ценности

Не забывайте о юзабилити—модальные окна должны иметь кнопки закрытия или возможность закрытия по клику вне границ модального контента, чтобы улучшить пользовательский опыт. Поддержка клавиши Esc, чтобы закрыть модальное окно, также может быть полезной.

Эти шаги позволят вам создать полностью функциональную систему модальных окон, которые будут корректно работать для любого количества публикаций.

Оцените материал
Добавить комментарий

Капча загружается...