如何在Bootstrap按钮下拉标题中显示所选项目


169

我在我的应用程序中使用bootstrap 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”)。

Answers:


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

@Behseini您能否阐明“同时获取所选值并将其发布到数据库”是哪个值?
2012年

如果您要在数据库中发布当前单击的项目值,我已经更新了答案。
2012年

2
嗨,Behseini,这个“ $(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小提琴示例


效果很好,我刚刚在选择“ $(this).parents(“。btn-group”)。find('。selection')。text($(this)之后添加了它们以隐藏下拉项.text())。end().children('.dropdown-toggle').dropdown('toggle');“
Senthil 2014年

4
Bootstrap 3.3.4的更新:
Parents

7
添加@cincplug建议的更改后,这应该是可接受的答案。此外,如果您想保持按钮文本的向下插入符号,则需要使用.html而不是.text并将范围连接到$(this).text()
MattD

@MattD,希望我对您接受的答案发表评论之前就已经看到您的评论-您已找到答案。
保罗

3
我建议存储$(this).parents(".dropdown").find('.btn')在变量中,而不要让jquery两次遍历DOM。
亚当

29

如果您有多个按钮下拉菜单,并且能够很好地与Bootstrap 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,然后单击了关闭。此时,选项一的文本应位于下拉菜单中,您该怎么做?
user1835351 2015年

当用户选择一个选项“ var selText = $(this).children(“ h4”)。html()“时,更改文本。
奥斯卡,2015年

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

我在严格模式下收到“未捕获的ReferenceError:未定义$ xx”
IvanTopić16-10-2

伊万,您发现在严格模式下有效的任何内容吗?
零零一分,2008年

这对于同一页面上的多个引导程序下拉菜单非常有用。谢谢!
米奇

5

你需要使用添加类open<div class="btn-group open">

li添加class="active"


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

1

这似乎是一个漫长的问题。我们想要的只是在输入组中实现一个select标记。但是引导程序不会这样做: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'并再次获取。

尝试为您单击的li元素添加data-selected-item ='true',然后

   $('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); 您可以让我知道我做错了吗?
Suffii 2012年

请查看更新后的答案。我将代码更改为$('ul.dropdown-menu li [data-selected-item] a')。text(); 试试这个
Murali Murugesan 2012年

0

我不得不在“ document.ready”代码内放置一些显示的javascript。否则,它们将无法正常工作。对于许多人来说可能是显而易见的,但对我而言却不是。因此,如果您要测试,请查看该选项。

<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) 不允许使用禁用的菜单项

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.