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

145

Я использую компонент Dropstrap 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. Другими словами, замените "Please Select From List" на выбранный элемент списка ( "Item I", "Item II", "Item III" ).

13 ответов

136
Лучший ответ

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

   });

});

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

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

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

 $(function(){

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

});

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

  • 1
    Привет, Джай, я попробовал твою примерную ссылку, но она там не работает, к тому же мне нужно взять выбранное значение, чтобы потом опубликовать в базе данных
  • 0
    @Behseini Можете ли вы уточнить, "какое значение также выбрать для публикации в базе данных"?
Показать ещё 9 комментариев
121

Обновлен для 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

  • 0
    Будет ли это работать в качестве замены для выбора / вариант в форме?
  • 0
    Прекрасно работает, и я только что добавил их, как показано ниже, чтобы скрыть выпадающие элементы после выделения "$ (this) .parents (". Btn-group "). Find ('. Selection'). Text ($ (this) .text ()). end () .children ('.dropdown-toggle') .dropdown ('toggle'); "
Показать ещё 6 комментариев
25

Я смог немного улучшить Jai ответ на работу в случае, если у вас более одного выпадающего меню с довольно хорошей презентацией, которая работает с бутстрапом 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".

6

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

    $(".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());
    });
  • 0
    Я получаю «Uncaught ReferenceError: $ xx не определен» в строгом режиме
  • 0
    Иван, вы нашли что-нибудь, что работает в строгом режиме?
Показать ещё 1 комментарий
5

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

Изображение 2371 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");
});

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

Эта единственная функция 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>');
        });
    });
});
4

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

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

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

и в li добавить class="active"

3

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

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

Кажется, это долгая проблема. Все, что мы хотим, это просто реализовать тег select во входной группе. Но bootstrap не сделал бы этого: 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>

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

Мне пришлось поместить некоторые отображаемые 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) не разрешать использование отключенных пунктов меню

0

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

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

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

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

Информацию об использовании атрибутов данных в jQuery см. данные jQuery

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню