我有一个包含多个其他collapse
元素的Bootstrapcollapse
元素,当单击(显示或隐藏(collapse
时,我想捕获该事件。
我遇到的问题是,如果单击嵌套的折叠按钮(对于父折叠和单击的折叠(,collapse
事件会被激发两次。
以下是显示问题的演示:https://jsfiddle.net/6nbsp9c1/2/
当点击嵌套按钮时,事件会被触发两次,我该如何解决这个问题?
您需要使用stopImmediatePropagation来确保事件不会被多次调用。
Event接口的
stopImmediatePropagation()
方法防止调用同一事件的其他侦听器。
实时演示:
$(document).on('show.bs.collapse hide.bs.collapse', '.collapse', function(e) {
e.stopImmediatePropagation(); //use this
console.log('event triggered');
});
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<a class="btn btn-primary" data-toggle="collapse" href="#collapseExample" role="button" aria-expanded="false" aria-controls="collapseExample">
Link with href
</a>
<div class="collapse" id="collapseExample">
<div class="card card-body">
test test test
<a class="btn btn-primary" data-toggle="collapse" href="#collapseExample2" role="button" aria-expanded="false" aria-controls="collapseExample2">
Link with href
</a>
<div class="collapse" id="collapseExample2">
<div class="card card-body">
test test test
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
只需使用jQuery stopPropagation((方法:
$(document).on('show.bs.collapse hide.bs.collapse', '.collapse', function(e) {
e.stopPropagation();
console.log('event triggered');
});
防止事件在DOM树中冒泡,防止任何父处理程序不会收到事件通知。
也在JSFiddle上。