Garder Bootstrap Dropdown Ouvert Lorsque Cliqué
si le dropdown est visible, et que je clique à l'extérieur du dropdown, il se ferme. J'en ai besoin pour ne pas fermer.
dans la documentation:
une fois ouvert, le plugin ajoute aussi .dropdown-backdrop comme une zone de clic pour fermer les menus dropdown en cliquant à l'extérieur du menu.
quel JavaScript puis-je ajouter pour empêcher la chute de fermer?
7 réponses
De la section événements de la Bootstrap dropdown
de la documentation:
hide.bs.dropdown
: cet événement est déclenché immédiatement lorsque la méthode hide instance a été appelée.
pour commencer, pour éviter la fermeture de la descente, nous pouvons simplement écouter cet événement et l'empêcher de continuer en retournant false
:
$('#myDropdown').on('hide.bs.dropdown', function () {
return false;
});
pour une solution complète, vous voulez probablement lui permettre de se fermer lorsque le dropdown lui-même est cliqué. Donc seulement une partie du temps nous voulons empêcher la boîte de fermer.
pour ce faire, nous placerons les drapeaux .data()
dans deux autres événements soulevés par le dropdown:
-
shown.bs.dropdown
- Une fois affiché, nous mettrons.data('closable')
àfalse
-
click
- une fois cliqué, nous allons mettre.data('closable')
àtrue
ainsi, si l'événement hide.bs.dropdown
a été soulevé par un click
sur la descente, nous autoriserons une fermeture.
live Demo in jsFiddle
JavaScript
$('.dropdown.keep-open').on({
"shown.bs.dropdown": function() { this.closable = false; },
"click": function() { this.closable = true; },
"hide.bs.dropdown": function() { return this.closable; }
});
HTML (note j'ai ajouté la classe keep-open
à la liste déroulante)
<div class="dropdown keep-open">
<!-- Dropdown Button -->
<button id="dLabel" role="button" href="#" class="btn btn-primary"
data-toggle="dropdown" data-target="#" >
Dropdown <span class="caret"></span>
</button>
<!-- Dropdown Menu -->
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</div>
dans certaines dépendances ont fait que KyleMit, et la plupart des autres solutions, n'ont plus fonctionné. J'ai creusé un peu plus loin et pour quelque raison un click()
est envoyé quand Bootstrap tente et échoue hide.bs.dropdown
, suivi d'un autre appel à hide.bs.dropdown
. J'ai contourné ce problème en forçant la fermeture click()
à se produire sur le bouton lui-même, pas l'ensemble du menu déroulant.
live Demo in Bootply
JavaScript
$('.keep-open').on({
"shown.bs.dropdown": function() { $(this).attr('closable', false); },
//"click": function() { }, // For some reason a click() is sent when Bootstrap tries and fails hide.bs.dropdown
"hide.bs.dropdown": function() { return $(this).attr('closable') == 'true'; }
});
$('.keep-open').children().first().on({
"click": function() {
$(this).parent().attr('closable', true );
}
})
HTML
<h2>Click the dropdown button </h2>
<p>It will stay open unless clicked again to close </p>
<div class="dropdown keep-open">
<!-- Dropdown Button -->
<button id="dLabel" role="button" href="#" data-toggle="dropdown" data-target="#" class="btn btn-primary">
Dropdown <span class="caret"></span>
</button>
<!-- Dropdown Menu -->
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</div>
$('.dropdown.keep-open').on({
"shown.bs.dropdown": function() { this.closable = true; },
"click": function(e) {
var target = $(e.target);
if(target.hasClass("btn-primary"))
this.closable = true;
else
this.closable = false;
},
"hide.bs.dropdown": function() { return this.closable; }
});
body {
margin: 10px;
}
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<h2>Click the dropdown button </h2>
<p>It will stay open unless clicked again to close </p>
<div class="dropdown keep-open">
<!-- Dropdown Button -->
<button id="dLabel" role="button" href="#"
data-toggle="dropdown" data-target="#"
class="btn btn-primary">
Dropdown <span class="caret"></span>
</button>
<!-- Dropdown Menu -->
<ul class="dropdown-menu" role="menu"
aria-labelledby="dLabel">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</div>
<!-- Post Info -->
<div style='position:fixed;bottom:0;left:0;
background:lightgray;width:100%;'>
About this SO Question: <a href='http://stackoverflow.com/q/19740121/1366033'>Keep dropdown menu open</a><br/>
Fork This Skeleton Here <a href='http://jsfiddle.net/KyleMit/kcpma/'>Bootrsap 3.0 Skeleton</a><br/>
Bootstrap Documentation: <a href='http://getbootstrap.com/javascript/#dropdowns'>Dropdowns</a><br/>
<div>
j'ai trouvé une solution qui ne nécessite pas de nouveaux js. Ne pas utiliser une goutte vers le bas et utiliser Bootstrap collap à la place. J'utilise encore des classes de descente pour le style comme une descente.
<div class="dropdown">
<button class="dropdown-toggle" type="button" data-toggle="collapse" data-target="#myList">Drop Down
<span class="caret"></span></button>
<div id="myList" class="dropdown-menu">
<input type="checkbox" name="vehicle" value="Bike"> I have a bike<br>
<input type="checkbox" name="vehicle" value="Car"> I have a car<br></div>
j'ai réussi à utiliser une combinaison de la solution de KyleMitt ci-dessus et ai rencontré des problèmes lors de l'utilisation de ce dans un objet de pied de page (je crois que c'est dû à la création dynamique de la table). J'ai appliqué .gardez-le .déroulante. div au plus haut niveau.
$('#contact_table').on("click", '.keep-open', function () {
this.closable = false;
});
$('#contact_table').on("shown.bs.dropdown", '.keep-open', function () {
this.closable = true;
});
$('#contact_table').on("hide.bs.dropdown", '.keep-open', function () {
let ret = this.closable;
this.closable = true;
return ret;
});
la fonctionnalité de ce code vous permet de cliquer à l'extérieur pour fermer le dropdown, mais en cliquant sur les éléments à l'intérieur il maintiendrait être ouvert. S'il vous plaît laissez-moi savoir si vous avez des suggestions/commentaires à ce sujet et je vais essayer de modifier.
autre solution pour cela. Gardez le dropdown ouvert après avoir cliqué à l'intérieur .dropdown-menu:
$('.heading .options .dropdown').on({
"shown.bs.dropdown":function(){this.closable = true;},
"click": function(e){
var target = $(e.target);
var d = target.data();
if(typeof d.toggle != 'undefined' && d.toggle == 'dropdown')
this.closable = true;
else {
var p = target.parent();
var dd = p.data();
if(typeof dd.toggle != 'undefined' && dd.toggle == 'dropdown')
this.closable = true;
else {
if(target.hasClass('dropdown-menu'))
this.closable = false;
else {
var pp = target.parent('.dropdown-menu');
if(typeof pp != 'undefined')
this.closable = false;
else
this.closable = true;
}
}
}
},
"hide.bs.dropdown": function(){return this.closable;}
});
garder le dropdown ouvert après avoir cliqué à l'intérieur .menu déroulant
$(document.body).on({
"shown.bs.dropdown": function(){ this.closable = true; },
"hide.bs.dropdown": function(){ return this.closable; },
"click": function(e){ this.closable = !$(e.target).closest(".dropdown-menu").length; },
},".dropdown.keepopen");