繁体   English   中英

为什么事件处理程序被触发两次?

[英]Why are the event handlers fired twice?

如果我折叠或展开“id-1”,则处理程序正常工作。

如果我折叠或展开“id-1-1”,则会触发两个处理程序:一个用于“id-1”,第二个用于“id-1-1”。

即使没有发生任何操作,为什么会为“id-1”触发事件?

 const myCollapsible = document.querySelectorAll('.collapse'); myCollapsible.forEach(myOne => { myOne.addEventListener('shown.bs.collapse', function() { console.log('shown ' + this.id); }); myOne.addEventListener('hidden.bs.collapse', function() { console.log('hidden ' + this.id); }); });
 <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.2/font/bootstrap-icons.css"> </head> <body> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-1"></a> <a href="#">id-1</a> <div class="collapse ms-4" id="id-1"> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-1-1"></a> <a href="#">id-1-1</a> <div class="collapse ms-4" id="id-1-1"> text </div> </div> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-1-2"></a> <a href="#">id-1-2</a> <div class="collapse ms-4" id="id-1-2"> text </div> </div> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-1-3"></a> <a href="#">id-1-3</a> <div class="collapse ms-4" id="id-1-3"> text </div> </div> </div> </div> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-2"></a> <a href="#">id-2</a> <div class="collapse ms-4" id="id-2"> text </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js"></script> </body> </html>

您需要e.stopPropagation()从您的孩子到顶级父母。

您可以在stopPropagation上找到更多信息

 const myCollapsible = document.querySelectorAll('.collapse'); myCollapsible.forEach(myOne => { myOne.addEventListener('shown.bs.collapse', function(e) { e.stopPropagation(); console.log('shown ' + this.id); }); myOne.addEventListener('hidden.bs.collapse', function(e) { e.stopPropagation(); console.log('hidden ' + this.id); }); });
 <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.2/font/bootstrap-icons.css"> </head> <body> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-1"></a> <a href="#">id-1</a> <div class="collapse ms-4" id="id-1"> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-1-1"></a> <a href="#">id-1-1</a> <div class="collapse ms-4" id="id-1-1"> text </div> </div> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-1-2"></a> <a href="#">id-1-2</a> <div class="collapse ms-4" id="id-1-2"> text </div> </div> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-1-3"></a> <a href="#">id-1-3</a> <div class="collapse ms-4" id="id-1-3"> text </div> </div> </div> </div> <div> <a class="bi-caret-right-fill link-dark text-decoration-none me-2" data-bs-toggle="collapse" href="#id-2"></a> <a href="#">id-2</a> <div class="collapse ms-4" id="id-2"> text </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js"></script> </body> </html>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM