Cómo mostrar el elemento seleccionado en el título desplegable del botón Bootstrap


168

Estoy usando el componente de arranque de arranque en mi aplicación de esta manera:

<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>

Me gustaría mostrar el elemento seleccionado como la etiqueta btn. En otras palabras, reemplace "Seleccione de la lista" con el elemento de la lista que ha sido seleccionado ("Elemento I", "Elemento II", "Elemento III").

Respuestas:


158

Según tengo entendido, su problema es que desea cambiar el texto del botón con el texto vinculado al hacer clic, si es así, puede probar este: 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());

   });

});

Según su comentario:

esto no funciona para mí cuando tengo elementos de listas <li>rellenados a través de una llamada ajax.

por lo que debe delegar el evento al padre estático más cercano con el .on()método jQuery:

 $(function(){

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

});

Aquí el evento se delega al padre estático $(".dropdown-menu"), aunque también puede delegar el evento $(document)porque siempre está disponible.


1
Hola Jai, probé tu enlace de muestra, pero no funciona allí, además, necesito tomar el valor seleccionado y publicarlo en la base de datos más tarde
Suffii

@Behseini ¿Puede aclarar "tomar el valor seleccionado y publicarlo en la base de datos" qué valor?
Jai

He actualizado la respuesta si el valor actual del elemento en el que ha hecho clic desea publicar en la base de datos.
Jai

2
Hola Behseini, este "$ (function () {});" es equivalente a "$ (documento) .ready (function () {});" puede encontrar más información aquí: api.jquery.com/ready
Jai

1
¿No parece un poco tonto que ESTA sea la solución?
Christine

146

Actualizado para Bootstrap 3.3.4:

Esto le permitirá tener diferentes valores de texto y datos de visualización para cada elemento. También persistirá la preocupación en la selección.

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>

JS Fiddle Example


Funciona muy bien y los acabo de agregar a continuación para ocultar los elementos desplegables después de la selección "$ (this) .parents (". Btn-group "). Find ('. Selection'). Text ($ (this) .text ()). end () .children ('.dropdown-toggle') .dropdown ('toggle'); "
Senthil

44
Actualización para Bootstrap 3.3.4: los padres (". Input-group-btn") deben reemplazarse por padres (".
Dropdown

77
Esta debería ser la respuesta aceptada después de agregar el cambio sugerido por @cincplug. Además, si desea mantener el cursor hacia abajo en el texto del botón, deberá usar .html en lugar de .text y concatenar el intervalo $(this).text().
MattD

@MattD, desearía haber visto tu comentario antes de comentar la respuesta aceptada: estás en lo cierto.
Paul

3
Sugiero almacenar $(this).parents(".dropdown").find('.btn')en una variable en lugar de hacer que jquery atraviese el DOM dos veces.
Adam

29

Pude mejorar ligeramente la respuesta de Jai al trabajo en el caso de que tengas más de un botón desplegable con una presentación bastante buena que funciona con bootstrap 3:

Código para el botón

<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>

Fragmento de 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());

});

También agregué un margen derecho de 5px a la clase "selección".


11

Esta única función jQuery hará todo lo que necesita.

$( 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>');
        });
    });
});

Gracias ! esta respuesta me salvó después de perder mis 10 minutos leyendo todas las demás soluciones.
Aizuddin Badry

7

Aquí está mi versión de esto que espero pueda ahorrarle algo de tiempo :)

ingrese la descripción de la imagen aquí PARTE jQuery:

$(".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");
});

PARTE 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>  

¿Cómo hace que el texto del menú desplegable cambie a lo que el usuario acaba de seleccionar? Digamos que seleccionaron la opción 1, luego hicieron clic. El texto para la opción uno debería estar en el menú desplegable en este punto, ¿cómo lo haces?
usuario1835351

Cuando un usuario selecciona una opción "var selText = $ (this) .children (" h4 "). Html ()" cambia el texto.
Oskar

7

Este funciona en más de un menú desplegable en la misma página. Además, agregué caret en el elemento seleccionado:

    $(".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());
    });

Obtengo "Error de referencia no capturado: $ xx no está definido" en modo estricto
Ivan Topić

Ivan, ¿encontraste algo que funcione en modo estricto?
ceros y unos

Esto funciona muy bien para múltiples menús desplegables de arranque en la misma página. ¡Gracias!
Mitch

5

necesitas usar add class openen <div class="btn-group open">

y en liagregarclass="active"


4

Modificado aún más en función de la respuesta de @Kyle ya que $ .text () devuelve una cadena exacta, por lo que la etiqueta de caret se imprime literalmente, en lugar de un marcado, en caso de que alguien quiera mantener el caret intacto en el menú desplegable.

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

3

He corregido el script para múltiples menús desplegables en la página

$(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());
   });
});

3

Otra forma simple (Bootstrap 4) de trabajar con múltiples menús desplegables

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

1

Parece ser un problema largo. Todo lo que queremos es implementar una etiqueta de selección en el grupo de entrada. Pero el bootstrap no lo haría: https://github.com/twbs/bootstrap/issues/10486

el truco es simplemente agregar la clase "btn-group" al div padre

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>');       
});

0

Una vez que haga clic en el elemento, agregue algunos atributos de datos como data-selected-item = 'true' y vuelva a obtenerlo.

Intente agregar data-selected-item = 'true' para el elemento li en el que hizo clic, luego

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

Antes de agregar este atributo, simplemente elimine el elemento seleccionado de datos existente en la lista. Espero que esto te ayude

Para obtener información sobre el uso de atributos de datos en jQuery, consulte los datos de jQuery


Hola Murali, gracias por tu comentario. Intenté esto pero aún no obtengo nada. var test = $('ul.dropdown-menu li').data('selected-item').find('a').text(); $("#nbtn").html(test); ¿Podrían decirme qué estoy haciendo mal?
Suffii

Por favor vea la respuesta actualizada. Cambié el código a $ ('ul.dropdown-menu li [data-selected-item] a'). Text (); Prueba esto
Murali Murugesan

0

Tuve que poner algunos de los javascripts mostrados arriba dentro del código "document.ready". De lo contrario, no funcionaron. Probablemente obvio para muchos, pero no para mí. Entonces, si estás probando, mira esa opción.

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

0

Por ejemplo:

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>

Uso el nuevo elemento BtnCaption para cambiar solo el texto del botón.

Pegar en $(document).ready(function () {}el siguiente texto

JavaScript:

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

:not(.disabled) no permita usar los elementos de menú deshabilitados

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.