ブートストラップボタンのドロップダウンタイトルに選択したアイテムを表示する方法


168

次のように、アプリケーションでブートストラップドロップダウンコンポーネントを使用しています。

<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」)に置き換えます。

回答:


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)は常に利用可能であるため、イベントも委任できます。


1
こんにちはJai私はあなたのサンプルリンクを試してみましたが、そこでは機能しません。また、選択した値も取得して後でデータベースに投稿する必要があります
Suffii

@Behseiniどの値を「データベースに投稿するために選択した値も取得する」ことを明確にしていただけますか?
Jai

現在クリックしたアイテムの値をデータベースに投稿する場合は、回答を更新しました。
Jai

2
こんにちはBehseiniさん、この "$(function(){});" 「$(document).ready(function(){});」と同等です。詳細については、api.jquery.com
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の例


うまく機能し、「$(this).parents( "。btn-group")。find( '。selection')。text($(this)を選択した後、ドロップダウン項目を非表示にするために以下のように追加しました.text())。end().children( '.dropdown-toggle').dropdown( 'toggle'); "
Senthil 2014年

4
Bootstrap 3.3.4のアップデート:parents( "
。input

7
@cincplugによって提案された変更が追加された後、これは受け入れられる答えになるはずです。さらに、ボタンのテキストのダウンキャレットを維持したい場合は、.textの代わりに.htmlを使用して、スパンをに連結する必要があります$(this).text()
MattD、2015

@MattD、私が受け入れられた答えにコメントする前に、あなたのコメントを見ていたらいいのに-あなたはその場にいます。
ポール・

3
$(this).parents(".dropdown").find('.btn')jqueryがDOMを2回トラバースするのではなく、変数に格納することをお勧めします。
アダム

29

ブートストラップ3で動作する非常に優れたプレゼンテーションで、複数のボタンドロップダウンがある場合に動作するように、Jaiの回答を少し改善することができました。

ボタンのコード

<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スニペット

$(".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マージン右を追加しました。


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分を無駄にした後で私を救います。
Aizuddin Badry

7

これが私のバージョンです。これにより、時間を節約できます:)

ここに画像の説明を入力してください 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>  

ドロップダウンのテキストを、ユーザーが選択したものにどのように変更しますか?彼らがオプション1を選択し、それをクリックしたとしましょう。この時点で、オプション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 is not defined」が表示される
IvanTopićOct

Ivan strictモードで動作するものを見つけましたか?
zeros-and-ones

これは、同じページの複数のブートストラップドロップダウンに最適です。ありがとうございました!
ミッチ

5

クラスopenを 追加する必要があります<div class="btn-group open">

そして、でliアドオンclass="active"


4

$ .text()は正確な文字列を返すため、@ Kyleからの回答に基づいてさらに変更されます。そのため、ドロップダウンでキャレットをそのまま維持したい場合に備えて、キャレットタグはマークアップとしてではなく文字どおりに出力されます。

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

複数のドロップダウンを操作するもう1つの簡単な方法(Bootstrap 4)

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

1

それは長い問題のようです。必要なのは、入力グループに選択タグを実装することだけです。しかし、ブートストラップはそれを行いません:https : //github.com/twbs/bootstrap/issues/10486

トリックは、親divに「btn-group」クラスを追加することです

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

アイテムをクリックしたら、data-selected-item = 'true'のようなデータ属性を追加して、再度取得します。

試してみてください=「true」のデータ選択項目を追加するためにli要素、その後、クリックしたことを

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

この属性を追加する前に、リストから既存のdata-selected-itemを削除するだけです。これがあなたを助けることを願っています

jQueryでのデータ属性の使用については、jQueryデータを参照してください。


こんにちはMurali urコメントありがとう、私はこれを試しましたが、それでも何も得られ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

表示されたjavascriptの一部を「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) 無効なメニュー項目の使用を許可しない

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.