Reputation:
Avoid dropdown closing by clicking outside.Show and hide dropdown while clicking only on button. Heres the fiddle.
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">Dropdown Example
<span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a href="#">HTML</a></li>
<li><a href="#">CSS</a></li>
<li><a href="#">JavaScript</a></li>
</ul>
</div>
Upvotes: 9
Views: 13743
Reputation: 362820
Bootstrap 4 Dropdown eventing is slightly different than Bootstrap 3, therefore the suggested duplicates (and here) will not work to prevent the dropdown from closing on an outside click.
For Bootstrap 4, look for the clickEvent
, and when found in the hide
event, prevent the default close behavior. This dropdown will only close when the button is clicked.
$('#myDD').on('hide.bs.dropdown', function (e) {
if (e.clickEvent) {
e.preventDefault();
}
})
In some cases, you may want the Dropdown to close when the button or menu is clicked. In this case you can examine the clickEvent target. For example, look for the 'nav-link' class.
$('#myDD').on('hide.bs.dropdown', function (e) {
if (e.clickEvent && e.clickEvent.target.className!="nav-link") {
e.preventDefault();
}
});
Upvotes: 13
Reputation: 34135
I think you just need to make your own menu-toggling click event instead of using the one bootstrap provides and then attempting to override things
var $ddlBtn = $("#my-custom-ddl");
$ddlBtn.on("click", function(){
var expanded = /true/i.test($ddlBtn.attr("aria-expanded"));
$ddlBtn
.attr("aria-expanded", !expanded)
.parent().toggleClass("open");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" />
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" id="my-custom-ddl" aria-haspopup="true" aria-expanded="false">
Dropdown Example
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#">HTML</a></li>
<li><a href="#">CSS</a></li>
<li><a href="#">JavaScript</a></li>
</ul>
</div>
var $ddlBtn = $("#my-custom-ddl");
$ddlBtn.on("click", function(){
var expanded = /true/i.test($ddlBtn.attr("aria-expanded"));
$ddlBtn
.attr("aria-expanded", !expanded)
.siblings(".dropdown-menu").toggleClass("show")
.parent().toggleClass("show");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://netdna.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" id="my-custom-ddl" aria-haspopup="true" aria-expanded="false">
Dropdown Example
<span class="caret"></span>
</button>
<div class="dropdown-menu" aria-labelledby="my-custom-ddl">
<a class="dropdown-item" href="#">HTML</a>
<a class="dropdown-item" href="#">CSS</a>
<a class="dropdown-item" href="#">Javascript</a>
</div>
</div>
Upvotes: 1