首页  >  问答  >  正文

JS中如何选择多个同名的class类

我使用 PHP 动态渲染从数据库获取的这些列表,每个列表都有相同的类,因为我无法更改它,它会动态渲染。我通过 JavaScript 选择这些类,并在单击时创建一个事件,以使用隐藏类打开和关闭它们。

现在我有一个问题,这个事件对我有用,并且仅对第一个呈现的列表做出反应,但对其他列表不起作用。有什么方法可以做到这一点,我尝试了 querySelectorAll 和 getElementsByClassName 以及其他一些选择器,但没有任何效果。 PHP 代码:

<ul class="kartonul">
                        <?php
                         $user = get_user(); 
                         $user_id = $user['id'];
                             $query = "SELECT * FROM karton WHERE id_pacijent = $user_id";
                             $result = query($query);
                         
                             if($result->num_rows > 0) {
                                 
                                 while($row = $result->fetch_assoc()) {
                                     $karton = get_karton($user_id); 
                                     foreach($result as $karton) { 
                                      echo "<li class='likarton'>Karton " .$karton['id']." <i class='fa-solid fa-envelope'></i></li>
                                        <div  class='kartondiv hiddenRaspored'>
                                        <label class='kartonlabel'>Nalaz:</label> <br/>
                                        <p>" . $karton['nalaz'] . "</p>
                                        <label class='kartonlabel'>Dijagnoza:</label> <br/>
                                        <p>" . $karton['dijagnoza'] . "</p>
                                        <label class='kartonlabel'>Pregled:</label> <br/>
                                        <p>" . $karton['pregled'] . "</p>
                                        </div>";
                                     }
                                 }
                                }
                        ?>
                    </ul>

JavaScript 代码:

let karton = document.querySelector('.likarton');
let div = document.querySelector('.kartondiv');

karton.addEventListener('click', () => {
  if (div.classList.contains('hidden')) {
    div.classList.remove('hidden');
  } else {
    div.classList.add('hidden');
  }
});

这是一个模板: 模板 在此输入图像描述

P粉005134685P粉005134685180 天前306

全部回复(2)我来回复

  • P粉652523980

    P粉6525239802024-03-27 14:50:25

    您需要使用querySelectorAll()而不是querySelector()

    这样您将定位所有元素,而不是第一个匹配的元素。 然后,您应该循环遍历每个事件并添加一个事件侦听器,如下所示:

    let kartons  = document.querySelectorAll(".abc");
    
    kartons.forEach(el => {
        el.addEventListener("click", (event) => {
             // Something happens on click
    
        })
    });

    回复
    0
  • P粉674999420

    P粉6749994202024-03-27 14:10:01

    您仅选择第一个 .likarton 实例 - 这是通过使用 querySelectorAll() 修复的


    由于您使用的是 addEventListener,因此您将获得被单击的确切项目作为回调中的参数。

    使用此功能的正确 JavaScript 是 addEventListener('click', (event) => {})

    要引用触发事件处理程序的元素,您可以使用 event.currentTarget

    从那时起,您可以选择 div 并使用 .classList.* 修改类列表


    示例

    let karton = document.querySelectorAll('.likarton');
    
    for (let i = 0; i < karton.length; i++) {
      karton[i].addEventListener("click", (event) => {
        let div = document.querySelector('.kartondiv');
    
        if (div.classList.contains('hidden')) {
          div.classList.remove('hidden');
        } else {
          div.classList.add('hidden');
        }
      });
    }
    

    参考文献:

    回复
    0
  • 取消回复