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?

30
demandé sur KyleMit 2013-11-02 12:09:09

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>
88
répondu KyleMit 2014-07-10 20:32:15
Les changements de version de

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>
9
répondu Mike Kane 2016-08-01 05:22:45

$('.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>
3
répondu bhavik 2015-05-13 08:45:15

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>
2
répondu andrew dibiasio 2017-05-24 15:35:16

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.

1
répondu Honga 2018-02-04 18:55:39

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;}
});
0
répondu Tomasz Majerski 2015-09-23 10:54:33

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");
0
répondu Arron Mabrey 2016-01-25 16:39:21