循环中的多个模态显示相同的信息而不是不同的

Multiple Modals in a loop showing the same information instead of different

我正在尝试创建一个网页,其中包含一堆包含来自数据库的信息的卡片。

每张卡片上都会有一个 "More Info" 按钮,该按钮将创建一个弹出模式,其中包含与该卡片相同的信息以及更多信息。我知道我需要一个 while 循环来生成模态以及单独给模态不同的 ID。

我已经使用数据库的 "id" 列完成了必要的工作,这是唯一的,当我点击按钮时我确实得到了模式,但唯一的问题是,无论我点击哪个按钮,模态显示最后一张卡片的信息(如标题、字段、概要、描述)。

所有卡片都显示了它们的个人信息。听起来我的 while 循环有问题?我确实检查了源代码,它确实在每张特定卡片下方正确显示了带有自己 ID 的各个模态(带有正确的 ID,例如 1、2、3、4。)请提供帮助。

<?php
    include("Config.php");              
    $query = ("SELECT * FROM proj");            
    $result = mysqli_query($conn, $query) or die( mysqli_error($conn));         
    while($test = mysqli_fetch_array($result))                              
    {                       
    ?>                  
    <div class="card"><div class="container1">
    <div class="card-text">  
    <h4><b><?php echo $test['title']; ?></b></h4>
    <b>field: </b><?php echo $test['field']; ?></br>    
    <p><?php echo $test['synopsis']; ?></p>

  <!-- Trigger/Open The Modal -->
  <button id="myBtn<?php echo $test['id']; ?>">More Info</button>

  <!-- The Modal -->    
  <div id="myModal<?php echo $test['id']; ?>" class="modal"> 
  <!-- Modal content -->
  <div class="modal-content">  
    <span class="close">&times;</span>
        <h4><b><?php echo $test['title']; ?></b></h4>
        <p><b>field: </b><?php echo $test['field']; ?></p>      
        <p><?php echo $test['synopsis']; ?></p>
        <p><?php echo $test['description']; ?></p>  

 <script>
// Get the modal
var modal = document.getElementById("myModal<?php echo $test['id']; ?>");
// Get the button that opens the modal
var btn = document.getElementById("myBtn<?php echo $test['id']; ?>");
// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];
// When the user clicks the button, open the modal 
btn.onclick = function() {
  modal.style.display = "block";
}
// When the user clicks on <span> (x), close the modal
span.onclick = function() {
  modal.style.display = "none";
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
  if (event.target == modal) {
    modal.style.display = "NONE";
  }
}
</script>   
</div>
</div>      
</div>
</div>
</div>                      
            <?php
            }
            mysqli_close($conn);
            ?>

所以这段代码的问题是它在循环的每次迭代中生成一个新的 script 元素,它会覆盖所有变量和事件侦听器。

我建议采用不同的方法。

  1. 将卡片和模态降价留在循环中
  2. 给模态添加一个唯一的id,事实上,你已经有了那个<div id="myModal<?php echo $test['id']; ?>"></div>
  3. 现在让我们给按钮添加一个新的属性,像这样<button data-target="#myModal<?php echo $test['id']; ?>"></button>
  4. 从循环中删除 script 标签,并为 所有 按钮编写一个新的事件侦听器,它将仅显示具有 id 属性的模式等于被单击按钮的 data-target 属性

最终结果会是这样

<?php
    include("Config.php");              
    $query = ("SELECT * FROM proj");            
    $result = mysqli_query($conn, $query);         
    while($test = mysqli_fetch_array($result))                              
    {                       
    ?>                  
    <div class="card"><div class="container1">
    <div class="card-text">  
    <h4><b><?php echo $test['title']; ?></b></h4>
    <b>field: </b><?php echo $test['field']; ?></br>    
    <p><?php echo $test['synopsis']; ?></p>

  <!-- Trigger/Open The Modal -->
  <button data-target="myModal<?php echo $test['id']; ?>" class="action-btn">More Info</button>

  <!-- The Modal -->    
  <div id="myModal<?php echo $test['id']; ?>" class="modal"> 
  <!-- Modal content -->
  <div class="modal-content">  
    <span class="close">&times;</span>
        <h4><b><?php echo $test['title']; ?></b></h4>
        <p><b>field: </b><?php echo $test['field']; ?></p>      
        <p><?php echo $test['synopsis']; ?></p>
        <p><?php echo $test['description']; ?></p>   
</div>
</div>      
</div>
</div>
</div>                      
            <?php
            }
            mysqli_close($conn);
            ?>

           <script>
var buttons = document.querySelectorAll(".action-btn");
// Feel free to use any other way to iterate over buttons
for (var i = 0; i < buttons.length; i++) {
  buttons[i].addEventListener("click", function (event) {
    var modal = (document.getElementById(
      event.target.getAttribute("data-target")
    ).style.display = "block");
  });
}
// Add code to close modals
</script>   

注意:Bootstrap 提供了一种更简单的方法来使用具有所有可用功能的模式。参见 Bootstrap modal