Как отобразить выбранный элемент в кнопке начальной загрузки

168

Я использую в своем приложении загрузочный компонент Dropdown:

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

Я хотел бы отобразить выбранный элемент в качестве метки btn. Другими словами, замените «Пожалуйста, выберите из списка» на выбранный элемент списка («Элемент I», «Элемент II», «Элемент III»).

Suffii
источник

Ответы:

158

Насколько я понял, ваша проблема в том, что вы хотите изменить текст кнопки с помощью кликающего связанного текста, если вы можете попробовать это: 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());

   });

});

Согласно вашему комментарию:

это не работает для меня, когда у меня есть списки, <li>заполненные через вызов ajax.

поэтому вы должны делегировать событие ближайшему статическому родителю с помощью .on()метода jQuery:

 $(function(){

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

});

Здесь событие делегировано статическому родителю $(".dropdown-menu"), хотя вы также можете делегировать событие, $(document)потому что оно всегда доступно.

Jai
источник
1
Привет, Джай, я попробовал
твою примерную
@Behseini Можете ли вы уточнить, «какое значение также выбрать для публикации в базе данных»?
Jai
Я обновил ответ, если текущее значение кликаемого элемента вы хотите опубликовать в БД.
Jai
2
Привет Бехсеини, это "$ (function () {});" эквивалентно "$ (document) .ready (function () {});" Вы можете найти больше информации здесь: api.jquery.com/ready
Jai
1
Не кажется ли вам немного странным, что ЭТО решение?
Кристина
146

Обновлено для Bootstrap 3.3.4:

Это позволит вам иметь различный отображаемый текст и значение данных для каждого элемента. Также сохранится каретка при выборе.

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

cmcculloh
источник
Отлично работает, и я только что добавил их, как показано ниже, чтобы скрыть выпадающие элементы после выделения "$ (this) .parents (". Btn-group "). Find ('. Selection'). Text ($ (this) .text ()). end () .children ('.dropdown-toggle') .dropdown ('toggle'); "
Сентил
4
Обновление для Bootstrap 3.3.4: родители (". Input-group-btn") должны быть заменены родителями (".
Dropdown
7
Это должен быть принятый ответ после добавления изменения, предложенного @cincplug. Кроме того, если вы хотите сохранить нижний каркас для текста кнопки, вам нужно будет использовать .html вместо .text и объединить интервал с ним $(this).text().
MattD
@ MattD, я бы хотел увидеть ваш комментарий, прежде чем прокомментировать принятый ответ - вы на месте.
Пол
3
Я предлагаю хранить $(this).parents(".dropdown").find('.btn')в переменной вместо того, чтобы jquery дважды проходил через DOM.
Адам
29

Я смог немного улучшить ответ Джая на работу в случае, если у вас есть несколько раскрывающихся списков кнопок с довольно хорошей презентацией, которая работает с начальной загрузкой 3:

Код для кнопки

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

JQuery Snippet

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

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

});

Я также добавил 5px margin-right к классу "selection".

Кайл Кроссман
источник
11

Эта единственная функция jQuery сделает все, что вам нужно.

$( 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>');
        });
    });
});
Мангирдас Скрипка
источник
Спасибо ! этот ответ спас меня после 10 минут, потраченных на чтение всех других решений.
Айзуддин Бадри
7

Вот моя версия, которая, я надеюсь, может сэкономить ваше время :)

введите описание изображения здесь 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");
});

HTML PART:

<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
источник
Как сделать так, чтобы текст в раскрывающемся списке изменился на то, что выбрал пользователь? Скажем, они выбрали вариант 1, а затем отключили. Текст для первого варианта должен быть в раскрывающемся списке, как вы это делаете?
user1835351
Когда пользователь выбирает опцию "var selText = $ (this) .children (" h4 "). Html ()", меняйте текст.
Оскар
7

Этот работает на нескольких выпадающих на одной странице. Кроме того, я добавил каретку на выбранный предмет:

    $(".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());
    });
Чудо-мальчик
источник
Я получаю «Uncaught ReferenceError: $ xx не определен» в строгом режиме
Иван Топич
Иван, вы нашли что-нибудь, что работает в строгом режиме?
нули и единицы
Это прекрасно работает для нескольких выпадающих на одной странице. Спасибо!
Митч
5

вам нужно использовать добавить класс openв <div class="btn-group open">

и в liдобавленииclass="active"

NullPoiиteя
источник
4

Дальнейшее изменение, основанное на ответе @Kyle, так как $ .text () возвращает точную строку, поэтому тег каретки печатается буквально, а не как разметка, на тот случай, если кто-то захочет сохранить его в выпадающем списке.

$(".dropdown-menu li").click(function(){
  $(this).parents(".btn-group").find('.btn').html(
  $(this).text()+" <span class=\"caret\"></span>"
  );
});
кругозор
источник
3

Я исправил скрипт для нескольких выпадающих на странице

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

Еще один простой способ (Bootstrap 4) для работы с несколькими выпадающими

    $('.dropdown-item').on('click',  function(){
        var btnObj = $(this).parent().siblings('button');
        $(btnObj).text($(this).text());
        $(btnObj).val($(this).text());
    });
Hitham S. AlQadheeb
источник
1

Это кажется долгой проблемой. Все, что мы хотим, это просто реализовать тег select в группе ввода. Но загрузчик не будет этого делать: https://github.com/twbs/bootstrap/issues/10486

хитрость заключается в добавлении класса "btn-group" в родительский div

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>

ЯШ:

$(".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
источник
0

Как только вы щелкнете по элементу, добавьте некоторый атрибут данных, например data-selected-item = 'true', и получите его снова.

Попробуйте добавить data-selected-item = 'true' для элемента li, который вы щелкнули, затем

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

Перед добавлением этого атрибута вы просто удаляете существующий элемент data-selected-item из списка. Надеюсь, это поможет вам

Для получения информации об использовании атрибутов данных в jQuery, обратитесь к данным jQuery.

Мурали Муругесан
источник
Привет Мурали, спасибо за ваш комментарий, я попробовал это, но до сих пор не получил ничего, var test = $('ul.dropdown-menu li').data('selected-item').find('a').text(); $("#nbtn").html(test); пожалуйста, дайте мне знать, что я делаю неправильно?
Суффи
Пожалуйста, смотрите обновленный ответ. Я изменил код на $ ('ul.dropdown-menu li [data-selected-item] a'). Text (); Попробуйте это
Murali Murugesan
0

Мне пришлось поместить некоторые отображаемые javascripts выше внутри кода «document.ready». Иначе они не сработали. Наверное, очевидно для многих, но не для меня. Так что, если вы тестируете, посмотрите на эту опцию.

<script type="text/javascript">
$(document).ready(function(){
//rest of the javascript code here
});
</script>
Нико Винк
источник
0

Например:

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>

Я использую новый элемент BtnCaption только для изменения текста кнопки.

Вставить в $(document).ready(function () {} следующий текст

JavaScript:

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

:not(.disabled) не разрешать использовать отключенные пункты меню

Дмитрий Дубровин
источник