прослушиватель событий hide.bs.dropdown не запускается в bootstrap 5

#twitter-bootstrap #event-listener

#twitter-bootstrap #прослушиватель событий

Вопрос:

 function bsDropdown(e) {
  e.addEventListener('show.bs.dropdown',yay)
  e.addEventListener('hide.bs.dropdown',nay)
}
function yay() {
document.getElementById('yay').innerHTML = 'yay'
}
function nay() {
document.getElementById('nay').innerHTML = 'nay'
}
document.querySelectorAll('.dropdown-toggle').forEach(bsDropdown) 
 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"/>
<p id="yay">1</p>
<p id="nay">2</p>

<div class="dropdown">
  <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
    Dropdown button
  </button>
  <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
    <li><a class="dropdown-item" href="#">Action</a></li>
    <li><a class="dropdown-item" href="#">Another action</a></li>
    <li><a class="dropdown-item" href="#">Something else here</a></li>
  </ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"></script> 

Ответ №1:

Возможно, вы ищете эту проблему с выпадающими событиями

Наиболее близкое поведение все еще может быть достигнуто следующим образом

 document.body.addEventListener("click", nay);
function bsDropdown(e) {
    e.addEventListener("show.bs.dropdown", yay);
}
function yay() {
    document.getElementById("yay").innerHTML = "yay";
}
function nay() {
    if (document.getElementById("dropdownMenuButton").classList.contains("show")) {
        document.getElementById("nay").innerHTML = "nay";
    }
}
document.querySelectorAll(".dropdown-toggle").forEach(bsDropdown); 
 body{
height:100vh;} 
 <link
            href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css"
            rel="stylesheet"
            integrity="sha384-giJF6kkoqNQ00vy HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1"
            crossorigin="anonymous"
        />

        <p id="yay">1</p>
        <p id="nay">2</p>

        <div class="dropdown">
            <button
                class="btn btn-secondary dropdown-toggle"
                type="button"
                id="dropdownMenuButton"
                data-bs-toggle="dropdown"
                aria-expanded="false"
            >
                Dropdown button
            </button>
            <ul class="dropdown-menu hide" aria-labelledby="dropdownMenuButton">
                <li><a class="dropdown-item" href="#">Action</a></li>
                <li><a class="dropdown-item" href="#">Another action</a></li>
                <li>
                    <a class="dropdown-item" href="#">Something else here</a>
                </li>
            </ul>
        </div>
        <script
            src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
            crossorigin="anonymous"
        ></script> 

Я сохранил высоту корпуса до 100 Вч, чтобы охватить весь экран, даже если содержимое очень мало, я знаю, что body EventListener будет запускаться при каждом нажатии на body, но я не думаю, что это вызовет какие-либо проблемы.