Создание модала с помощью JS на основе выбранной ссылки

#javascript #html

#javascript #HTML

Вопрос:

 function getId(id) {
    var modal = document.getElementById(id);
    
    var span = document.getElementsByClassName("close")[0];
    
    modal.style.display = "block";
    
    span.onclick = function() {
        modal.style.display = "none";
    }
    
    window.onclick = function(event) {
        if (event.target == modal) {
            modal.style.display = "none";
        }
    }
} 
 #main{  left: 0px;
        position: relative;
        float: left;}
    
#main p{    font-family: Verdana, Helvetica, Arial, sans-serif;
            font-size: .8em;
            text-align: justify;
            line-height: 1.5em;
            margin-top: 25px;}

.modal {
  display: none; /* Hidden by default */
  position: center;
  z-index: 1; /* Sit on top */
  left: 0;
  top: 0;
  width: 100%; /* Full width */
  height: 100%; /* Full height */
  overflow: auto; /* Enable scroll if needed */
  background-color: rgb(0,0,0); /* Fallback color */
  background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}

.modal-header {
  padding: 2px 16px;
  background-color: #5cb85c;
  color: white;
}

/* Modal Body */
.modal-body {padding: 2px 16px;}

/* Modal Footer */
.modal-footer {
  padding: 2px 16px;
  background-color: #5cb85c;
  color: white;
}

/* Modal Content */
.modal-content {
  position: relative;
  background-color: #fefefe;
  margin: auto;
  padding: 0;
  border: 1px solid #888;
  width: 80%;
  box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);
  animation-name: animatetop;
  animation-duration: 0.4s
}

/* Add Animation */
@keyframes animatetop {
  from {top: -300px; opacity: 0}
  to {top: 0; opacity: 1}
}

/* The Close Button */
.close {
  color: #aaa;
  float: right;
  font-size: 28px;
  font-weight: bold;
}

.close:hover,
.close:focus {
  color: black;
  text-decoration: none;
  cursor: pointer;
} 
 <!-- main body of the HTML -->
<div id="main" >
                <h1>Current Members</h1>
                <center>
                    <table width="75%" border="0">
                        <th>Committee Members</th>
                            <tr height="50">
                                <td><a href="#" id="howie" onClick="getId(this.id "-modal")">Howie Jones (President)</a></td>
                                <td><a href="#" id="ferdi" onClick="getId(this.id)">Fernando Russo (V.P.)</a></td>
                                <td><a href="#" id="ste" onClick="getId(this.id)">Steve Dicksons (Secretary)</a></td>
                                <td><a href="#" id="kym" onClick="getId(this.id)">Kym Jones (Treasurer)</a></td>
                            </tr>
                        <th>Members</th>
                            <tr height="50">
                                <td><a href="#" id="john" onClick="getId(this.id)">John Ketley</a></td>
                                <td><a href="#" id="mike" onClick="getId(this.id)">Mike Lamb</a></td>
                                <td><a href="#" id="sol" onClick="getId(this.id)">Sol Dean</a></td>
                            </tr>
                    </table>
                </center>
            </div>
      
<!-- modal in the same HTML file -->
  <div id="howie-modal" class="modal">
            <div class="modal-content">
                <div class="modal-header">
                    <span class="close">amp;times;</span>
                    <h2>Modal Header</h2>
                </div>
                <div class="modal-body">
                    <p>Some text in the Modal Body</p>
                    <p>Some other text...</p>
                </div>
                <div class="modal-footer">
                    <h3>Modal Footer</h3>
                </div>
            </div>
        </div> 

Я использую https://www.w3schools.com/howto/howto_css_modals.asp за основу добавления простого модального представления на мою HTML-страницу. Поскольку на моей главной странице есть несколько ссылок, я изменил JS следующим образом

 function getId(id) {
    var modal = document.getElementById(id);
    var span = document.getElementsByClassName("close")[0];

    modal.style.display = "block";

    span.onclick = function() {
        modal.style.display = "none";
    }

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

с кодом вызывающего абонента, который выглядит следующим образом

 <center>
    <table width="75%" border="0">
        <th>Committee Members</th>
            <tr height="50">
                <td><a href="#" id="howie" onClick="getId(this.id)">Howie Jones (President)</a></td>
                <td><a href="#" id="ferdi" onClick="getId(this.id)">Fernando Russo (V.P.)</a></td>
                <td><a href="#" id="ste" onClick="getId(this.id)">Steve Dicksons (Secretary)</a></td>
                <td><a href="#" id="kym" onClick="getId(this.id)">Kym Jones (Treasurer)</a></td>
            </tr>
        <th>Members</th>
            <tr height="50">
                <td><a href="#" id="john" onClick="getId(this.id)">John Ketley</a></td>
                <td><a href="#" id="mike" onClick="getId(this.id)">Mike Lamb</a></td>
                <td><a href="#" id="sol" onClick="getId(this.id)">Sol Dean</a></td>
            </tr>
    </table>
</center>
 

Проблема в том, что когда я нажимаю на одну из ссылок, модал не отображается, а ссылка исчезает.

Модальный идентификатор для каждого модала устанавливается на то, что передается при нажатии на ссылку (например <div id="howie" class="modal">

Когда я запускаю это через webtools в Mozilla, из JS не обнаруживается ошибок, и код выполняется.

Я никогда раньше не делал ничего подобного, так что, скорее всего, я допустил ошибку новичка. Я рассматривал возможность создания модального и загрузки этой модальной веб-страницы, но применяется то же самое — не уверен, как это сделать в JS.

Комментарии:

1. Идентификаторы должны быть уникальными для документа (поэтому два элемента не могут иметь один и тот же идентификатор). Сделайте так, чтобы ваши модалы имели тот же идентификатор, но с добавлением «-modal», затем используйте getId(this.id "-modal") .

2. Используете ли вы фреймворк, подобный bootstrap, или обычный ванильный JS и CSS?

3. @Japsz — просто ванильный JS и CSS

4. @HereticMonkey — все идентификаторы элементов разные, поэтому на самом деле не нужно добавлять -modal к this.id часть (я даже не уверен, что это сработает, поскольку первая строка JS выполняет getElementById — или мы здесь говорим о разных целях?)

5. У вас есть ссылка. Он имеет идентификатор howie . У вас есть модальный элемент, который содержит то, что вы хотите показать в модале, верно? Он имеет идентификатор howie . Это два элемента с одинаковым идентификатором. Если у вас нет модального элемента (и теперь, когда я смотрю на ваш пример, его там нет), то что вы ожидаете увидеть, когда нажмете на ссылку? Хотя вы упоминаете <div id="howie" class="modal">