Comment afficher l'élément sélectionné dans le titre de la liste déroulante du bouton Bootstrap

168

J'utilise le composant Bootstrap Dropdown dans mon application comme ceci:

<div class="btn-group">
    <button class="btn">Please Select From List</button>
    <button class="btn dropdown-toggle" data-toggle="dropdown">
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu">
       <li><a tabindex="-1" href="#">Item I</a></li>
       <li><a tabindex="-1" href="#">Item II</a></li>
       <li><a tabindex="-1" href="#">Item III</a></li>
       <li class="divider"></li>
       <li><a tabindex="-1" href="#">Other</a></li>
    </ul>
</div>

Je voudrais afficher l'élément sélectionné comme étiquette btn. En d'autres termes, remplacez «Veuillez sélectionner dans la liste» par l'élément de liste qui a été sélectionné («Item I», «Item II», «Item III»).

Suffii
la source

Réponses:

158

Si j'ai bien compris, votre problème est que vous souhaitez modifier le texte du bouton avec le texte lié en cliquant, si c'est le cas, vous pouvez essayer celui-ci: http://jsbin.com/owuyix/4/edit

 $(function(){

    $(".dropdown-menu li a").click(function(){

      $(".btn:first-child").text($(this).text());
      $(".btn:first-child").val($(this).text());

   });

});

Selon votre commentaire:

cela ne fonctionne pas pour moi lorsque j'ai des listes d'éléments <li>remplis via un appel ajax.

vous devez donc déléguer l'événement au parent statique le plus proche avec la .on()méthode jQuery:

 $(function(){

    $(".dropdown-menu").on('click', 'li a', function(){
      $(".btn:first-child").text($(this).text());
      $(".btn:first-child").val($(this).text());
   });

});

Ici, l'événement est délégué au parent statique $(".dropdown-menu"), bien que vous puissiez également déléguer l'événement au parent $(document)car il est toujours disponible.

I have
la source
1
Salut Jai, j'ai essayé votre exemple de lien mais cela ne fonctionne pas là-bas, en plus je dois également saisir la valeur sélectionnée pour la publier dans la base de données plus tard
Suffii
@Behseini Pouvez-vous s'il vous plaît clarifier "saisir également la valeur sélectionnée pour la publier dans la base de données" quelle valeur?
Jai
J'ai mis à jour la réponse si la valeur actuelle de l'élément cliqué que vous souhaitez publier dans la base de données.
Jai
2
Salut Behseini, ce "$ (function () {});" est équivalent à "$ (document) .ready (function () {});" vous pouvez trouver plus d'informations ici: api.jquery.com/ready
Jai
1
Cela ne semble-t-il pas un peu hokey que CECI soit la solution?
Christine le
146

Mis à jour pour Bootstrap 3.3.4:

Cela vous permettra d'avoir un texte d'affichage et une valeur de données différents pour chaque élément. Il persistera également le curseur lors de la sélection.

JS:

$(".dropdown-menu li a").click(function(){
  $(this).parents(".dropdown").find('.btn').html($(this).text() + ' <span class="caret"></span>');
  $(this).parents(".dropdown").find('.btn').val($(this).data('value'));
});

HTML:

<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
    Dropdown
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
    <li><a href="#" data-value="action">Action</a></li>
    <li><a href="#" data-value="another action">Another action</a></li>
    <li><a href="#" data-value="something else here">Something else here</a></li>
    <li><a href="#" data-value="separated link">Separated link</a></li>
  </ul>
</div>

Exemple JS Fiddle

cmcculloh
la source
Fonctionne très bien et je viens de les ajouter comme ci-dessous pour masquer les éléments déroulants après la sélection "$ (this) .parents (". Btn-group "). Find ('. Selection'). Text ($ (this) .text ()). end () .children ('.dropdown-toggle') .dropdown ('toggle'); "
Senthil
4
Mise à jour pour Bootstrap 3.3.4: les parents (". Input-group-btn") doivent être remplacés par les parents (".
Dropdown
7
Cela devrait être la réponse acceptée après l'ajout du changement suggéré par @cincplug. De plus, si vous souhaitez conserver le curseur vers le bas sur le texte du bouton, vous devrez utiliser .html au lieu de .text et concaténer la plage sur $(this).text().
MattD
@MattD, j'aurais aimé voir votre commentaire avant de commenter la réponse acceptée - vous êtes sur place.
Paul
3
Je suggère de stocker $(this).parents(".dropdown").find('.btn')dans une variable au lieu de laisser jquery traverser le DOM deux fois.
Adam
29

J'ai pu légèrement améliorer la réponse de Jai pour qu'elle fonctionne dans le cas où vous auriez plus d'un menu déroulant avec une assez bonne présentation qui fonctionne avec bootstrap 3:

Code pour le bouton

<div class="btn-group">
  <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
    Option: <span class="selection">Option 1</span><span class="caret"></span>
  </button>
  <ul class="dropdown-menu" role="menu">
    <li><a href="#">Option 1</a></li>
    <li><a href="#">Option 2</a></li>
    <li><a href="#">Option 3</a></li>
  </ul>
</div>

Extrait JQuery

$(".dropdown-menu li a").click(function(){

  $(this).parents(".btn-group").find('.selection').text($(this).text());
  $(this).parents(".btn-group").find('.selection').val($(this).text());

});

J'ai également ajouté une marge droite de 5px à la classe "sélection".

Kyle Crossman
la source
11

Cette fonction jQuery unique fera tout ce dont vous avez besoin.

$( document ).ready(function() {
    $('.dropdown').each(function (key, dropdown) {
        var $dropdown = $(dropdown);
        $dropdown.find('.dropdown-menu a').on('click', function () {
            $dropdown.find('button').text($(this).text()).append(' <span class="caret"></span>');
        });
    });
});
Mangirdas Skripka
la source
Merci ! cette réponse me sauve après avoir perdu mes 10 minutes à lire toutes les autres solutions.
Aizuddin Badry
7

Voici ma version de celle-ci qui, j'espère, pourra vous faire gagner du temps :)

entrez la description de l'image ici jQuery PART:

$(".dropdown-menu").on('click', 'li a', function(){
  var selText = $(this).children("h4").html();


 $(this).parent('li').siblings().removeClass('active');
    $('#vl').val($(this).attr('data-value'));
  $(this).parents('.btn-group').find('.selection').html(selText);
  $(this).parents('li').addClass("active");
});

PARTIE HTML:

<div class="container">
  <div class="btn-group">
    <a class="btn btn-default dropdown-toggle btn-blog " data-toggle="dropdown" href="#" id="dropdownMenu1" style="width:200px;"><span class="selection pull-left">Select an option </span> 
      <span class="pull-right glyphiconglyphicon-chevron-down caret" style="float:right;margin-top:10px;"></span></a>

     <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
       <li><a href="#" class="" data-value=1><p> HER Can you write extra text or <b>HTLM</b></p> <h4> <span class="glyphicon glyphicon-plane"></span>  <span> Your Option 1</span> </h4></a>  </li>
       <li><a href="#" class="" data-value=2><p> HER Can you write extra text or <i>HTLM</i> or some long long long long long long long long long long text </p><h4> <span class="glyphicon glyphicon-briefcase"></span> <span>Your Option 2</span>  </h4></a>
      </li>
      <li class="divider"></li>
   <li><a href="#" class="" data-value=3><p> HER Can you write extra text or <b>HTLM</b> or some </p><h4> <span class="glyphicon glyphicon-heart text-danger"></span> <span>Your Option 3</span>  </h4></a>
      </li>
    </ul>
  </div>
  <input type="text" id="vl" />
</div>  
Oskar
la source
Comment modifier le texte de la liste déroulante en ce que l'utilisateur vient de sélectionner? Disons qu'ils ont sélectionné l'option 1, puis ont cliqué sur. Le texte de l'option 1 devrait être dans la liste déroulante à ce stade, comment faites-vous cela?
user1835351
Lorsqu'un utilisateur sélectionne une option "var selText = $ (this) .children (" h4 "). Html ()" changez le texte.
Oskar le
7

Celui-ci fonctionne sur plus d'un menu déroulant dans la même page. De plus, j'ai ajouté un curseur sur l'élément sélectionné:

    $(".dropdown-menu").on('click', 'li a', function(){
        $(this).parent().parent().siblings(".btn:first-child").html($(this).text()+' <span class="caret"></span>');
        $(this).parent().parent().siblings(".btn:first-child").val($(this).text());
    });
WonderBoy
la source
J'obtiens "Uncaught ReferenceError: $ xx is not defined" en mode strict
Ivan Topić
Ivan avez-vous trouvé quelque chose qui fonctionne en mode strict?
zéros-et-uns
Cela fonctionne très bien pour plusieurs listes déroulantes d'amorçage sur la même page. Je vous remercie!
Mitch
5

vous devez utiliser ajouter une classe opendans <div class="btn-group open">

et en liplusclass="active"

NullPoiиteя
la source
4

En outre modifié en fonction de la réponse de @Kyle car $ .text () retourne la chaîne exacte, de sorte que la balise caret est imprimée littéralement, plutôt que comme un balisage, juste au cas où quelqu'un voudrait garder le curseur intact dans la liste déroulante.

$(".dropdown-menu li").click(function(){
  $(this).parents(".btn-group").find('.btn').html(
  $(this).text()+" <span class=\"caret\"></span>"
  );
});
Ken
la source
3

J'ai corrigé le script pour plusieurs listes déroulantes sur la page

$(function(){
    $(".dropdown-menu li a").click(function(){
        var item = $(this);
        var id = item.parent().parent().attr("aria-labelledby");

        $("#"+id+":first-child").text($(this).text());
        $("#"+id+":first-child").val($(this).text());
   });
});
Sergio Promov
la source
3

Un autre moyen simple (Bootstrap 4) de travailler avec plusieurs listes déroulantes

    $('.dropdown-item').on('click',  function(){
        var btnObj = $(this).parent().siblings('button');
        $(btnObj).text($(this).text());
        $(btnObj).val($(this).text());
    });
Hitham S. AlQadheeb
la source
1

Cela semble être un long problème. Tout ce que nous voulons, c'est simplement implémenter une balise de sélection dans le groupe d'entrée. Mais le bootstrap ne le ferait pas: https://github.com/twbs/bootstrap/issues/10486

l'astuce consiste simplement à ajouter la classe "btn-group" à la div parent

html:

<div class="input-group">
  <div class="input-group-btn btn-group">
    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
      Product Name <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" role="menu">
        <li><a href="#">A</a></li>
        <li><a href="#">B</a></li>
    </ul>
  </div>
  <input type="text" class="form-control">
  <span class="input-group-btn">
    <button class="btn btn-primary" type="button">Search</button>
  </span>
</div>

js:

$(".dropdown-menu li a").click(function(e){
    var selText = $(this).text();
    $(this).parents('.input-group').find('.dropdown-toggle').html(selText+' <span class="caret"></span>');       
});
aGuegu
la source
0

Une fois que vous avez cliqué sur l'élément, ajoutez un attribut de données tel que data-selected-item = 'true' et récupérez-le à nouveau.

Essayez d' ajouter data-selected-item = 'true' pour l' élément li sur lequel vous avez cliqué, puis

   $('ul.dropdown-menu li[data-selected-item] a').text();

Avant d'ajouter cet attribut, vous supprimez simplement l'élément sélectionné de données existant dans la liste. J'espère que cela vous aiderait

Pour plus d'informations sur l'utilisation des attributs de données dans jQuery, reportez-vous aux données jQuery

Murali Murugesan
la source
Salut Murali, Merci pour votre commentaire, j'ai essayé cela mais je n'ai toujours rien obtenu.Pouvez- var test = $('ul.dropdown-menu li').data('selected-item').find('a').text(); $("#nbtn").html(test); vous s'il vous plaît me faire savoir ce que je fais de mal?
Suffii
Veuillez consulter la réponse mise à jour. J'ai changé le code en $ ('ul.dropdown-menu li [data-selected-item] a'). Text (); Essayez ceci
Murali Murugesan
0

J'ai dû mettre quelques javascripts affichés ci-dessus dans le code "document.ready". Sinon, ils n'ont pas fonctionné. Probablement évident pour beaucoup, mais pas pour moi. Donc, si vous testez, regardez cette option.

<script type="text/javascript">
$(document).ready(function(){
//rest of the javascript code here
});
</script>
Nico Vink
la source
0

Par exemple:

HTML:

<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
     <BtnCaption>Select item</BtnCaption>
     <span class="caret"></span>   
  </button>
  <ul class="dropdown-menu">
     <li><a href="#">Option 1</a></li>
     <li><a href="#">Option 2</a></li>
     <li class="disabled"><a href="#">Option 3</a></li>   
  </ul> 
</div>

J'utilise le nouvel élément BtnCaption pour modifier uniquement le texte du bouton.

Coller dans $(document).ready(function () {}le texte suivant

JavaScript:

    $(".dropdown-menu li:not(.disabled) a").click(function () {
        $(this).closest(".dropdown").find(".btn BtnCaption").text($(this).text()));
    });

:not(.disabled) ne pas autoriser l'utilisation des éléments de menu désactivés

Dmitrii Dubrovin
la source