Как открыть несколько модальных окон на одной странице с данными из API

В настоящее время у меня есть веб-страница, которая получает данные о публичных событиях из Github API. Для каждого из данных у меня есть он, где он будет генерировать кнопку для отображения информации на странице и div для отображения дополнительной информации в виде модального окна. По умолчанию у меня модальное окно скрыто. Я пытаюсь добраться туда, где каждый раз, когда я нажимаю кнопку, появляется соответствующий модальный экран. Я попытался исследовать это, и методы, которые я нашел, просто не работают с моим кодом, и я не могу понять, почему. Я думаю, это потому, что мои элементы генерируются вместо того, чтобы жестко закодировать их в файле HTML? Я все еще новичок в JavaScript, поэтому я действительно хочу в первую очередь придерживаться базового и, если возможно, сделать это с помощью vanillaJS.

Мой код:

function loadEvents()
{
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://api.github.com/events', true);
  xhr.onload = function()
  {
    if (this.status == 200)
    {
      var response = JSON.parse(this.responseText);

      var output = '';
      var modalResult = '';
      for(var i in response)
      {
        output +=
        //I'm using the id of the events to add on to the name of data-modal as a way of matching it up to the id of the modal later
        '<button class = "pubEvents" data-modal = "modal'+response[i].id+'">' +
        '<ul>' +
        '<li><b>Username:</b> '+response[i].actor.login+'</li>' +
        '<li><b>Event Type:</b> '+response[i].type+'</li>' +
        '<li><b>Repo:</b> '+response[i].repo.name+'</li>' +
        '</ul>' +
        '</button>' +
        '<div id = "modal'+response[i].id+'" class = "bgModal">' + //The id of the modal should match with the button attribute data-modal
        '<div class = "modalContent">' +
        '<div class = "modalHeader">' +
        '<span class = "closeBtn">&times;</span>' +
        '<img src = "'+response[i].actor.avatar_url+'"class = "avatar" width = "100px" height = "100px">' +
        '<h2><b>'+response[i].actor.login+'</b></h2>' +
        '</div>' + //modalHeader
        '<div class = "modalBody">' +
        '<ul>' +
        '<li><b>Event Type:</b> '+response[i].type+'</li>' +
        '<li><b>Repo:</b> '+response[i].repo.name+'</li>' +
        '</ul>' +
        '</div>' + //modalBody
        '<div class = "modalFooter">' +
        '<h2><a href = "https://github.com/'+response[i].repo.name+'" target = "_blank">Check out this repository here!</a></h2>' +
        '</div>' + //modalFooter
        '</div>' + //modalContent
        '</div>' //modalBox
        ;
      }
      document.getElementById('bodyContainer').innerHTML = output;
    }
  }
  xhr.send();
}

function refresh()
{
  location.reload(true);
}

//Here is my code where I try to "connect" the modal to its respective button
//Select all the button of events
var modalBtn = document.querySelectorAll('.pubEvents');
if (modalBtn) //If modalBtn exists
{
  //For each button, create an 'onclick' event
  modalBtn.forEach(function(btn){
    btn.onclick = function()
    {
      //Get the data-modal attribute of the button to "compare/match" to the id element of the modal
      var modalID = btn.getAttribute('data-modal');
      document.getElementById(modalID).style.display = "block";
    }
  });
}
body
{
  font-family: Arial, Helvetica, sans-serif;
  margin: 0;
  padding: 0;
}
#navbar
{
  float: left;
  height: 120px;
  width: 100%;
  padding-left: 20px;
  padding-right: 20px;
  background-color: #4AAAA5;
  color: #35404F;
}
#navbar ul li
{
  list-style-type: none;
  display: inline-block;
  padding-left: 15px;
  padding-right: 15px;
  font-size: 20px;
}
#navbar ul li a
{
  text-decoration: none;
}
#navbar ul li a:hover
{
  color: #A3D39C;
  cursor: pointer;
}
.selected
{
  border: 2px solid #A3D39C;
}
.pubEvents
{
  background-color: #	#F0F0F0;
  border: 2px solid #4AAAA5;
  border-radius: 10px;
  color: #35404F;
  width: 100%;
  font-size: 20px;
  margin-top: 20px;
  text-align: left;
}
.pubEvents ul li
{
  list-style-type: none;
}
#bodyContainer
{
  margin-left: 15px;
  margin-right: 15px;
}
.pubEvents:hover
{
  background-color: #A3D39C;
  cursor: pointer;
}
.bgModal
{
  display: none;
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  overflow: auto;
  background-color: rgba(0, 0, 0, 0.8);
  cursor: default;
}
.modalContent
{
  background-color:#F4F4F4;
  color: #35404F;
  margin: 10% auto;
  width:50%;
//height: 25%;
}
#modalContent ul li
{
  list-style-type: none;
  line-height: 1.6;
}
.modalHeader h2
{
  font-size: 30px;
  margin: 0;
}
.modalHeader
{
  background: #4AAAA5;
  padding: 15px;
  height: 100px;
  color: #35404F;
}
.modalBody
{
  font-size: 20px;
  padding: 10px 20px;
}
.modalFooter
{
  background: #4AAAA5;
  padding: 10px;
  text-align: center;
}
.modalFooter h2
{
  font-size: 25px;
}
.modalFooter a
{
  color: #35404F;
  text-decoration: none;
}
.modalFooter a:hover
{
  color: #7CCCC5;
  cursor: pointer;
}
.avatar
{
  float: left;
  margin-right: 20px;
}
.closeBtn
{
  float: right;
  font-size: 30px;
}
.closeBtn:hover
{
  color: #7CCCC5;
  cursor: pointer;
}
#refreshBtn
{
  position: fixed;
  bottom: 20px;
  right: 20px;
  border-radius: 10%;
  background-color: #7CCCC5;
  border: 2px solid #35404F;
  font-size: 25px;
  color: #35404F;
}
#refreshBtn:hover
{
  background-color: #A3D39C;
  cursor: pointer;
}
<!DOCTYPE html>
<html>

<link href = "ghDashboardCSS.css" rel = "stylesheet" type = "text/css">

<head>
  <meta charset = "utf-8">
  <title>Github Dashboard</title>
</head>

<body onload = "loadEvents()">
  <div id = "navbar">
    <h1>Github Dashboard</h1>
    <ul>
      <li class = "selected">PUBLIC EVENTS</a></li>
      <li><a>PERSONAL EVENTS</a></li>
    </ul>
  </div>

  <div id = "bodyContainer">

  </div>
  <button id = "refreshBtn" onclick = "refresh()">&#8635;<br>Refresh</button>

  <script src = "publicScript.js"></script>
</body
</html>

Наличие нескольких элементов с одним и тем же идентификатором является недопустимым HTML. Возможно, вы захотите это исправить.

CertainPerformance 22.05.2018 07:27

Что ты имеешь в виду конкретно? Потому что, если вы говорите об этой строке:

katchy 22.05.2018 07:32
<div id = "modalContent">
CertainPerformance 22.05.2018 07:37

'<div id = "modal' + response [i] .id + '" class = "bgModal">', тогда идентификатор действительно уникален. Я использовал идентификатор публичных событий, чтобы прикрепить его к концу модального окна. Таким образом, идентификатор для каждого модального окна: модальный # (# - это любое число, которое имеет идентификатор публичных событий)

katchy 22.05.2018 07:41

Ах хорошо. Дай мне попробовать.

katchy 22.05.2018 07:42

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

vikscool 22.05.2018 07:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
50
0

Другие вопросы по теме