วิธีการแสดงรายการที่เลือกในหัวข้อแบบเลื่อนลงของปุ่ม Bootstrap


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 กล่าวอีกนัยหนึ่งแทนที่ "โปรดเลือกจากรายการ" ด้วยรายการที่เลือก ("รายการฉัน", "รายการ 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
สวัสดีฉันพยายามลองลิงค์ตัวอย่าง แต่มันใช้งานไม่ได้นอกจากนั้นฉันต้องคว้าค่าที่เลือกไว้เช่นกันเพื่อโพสต์ไปยังฐานข้อมูลในภายหลัง
Suffii

@Behseini คุณช่วยอธิบายได้อย่างชัดเจน "คว้าค่าที่เลือกไว้และโพสต์ลงฐานข้อมูล" ซึ่งเป็นค่าใด?
อึ๊ง

ฉันได้อัปเดตคำตอบหากมูลค่ารายการที่คลิกในปัจจุบันคุณต้องการโพสต์ในฐานข้อมูล
อึ๊ง

2
สวัสดี Behseini นี่ "$ (ฟังก์ชั่น () {});" เทียบเท่ากับ "$ (document) .ready (function () {});" คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่: api.jquery.com/ready
Jai

1
ดูเหมือนจะไม่เป็นความจริงหรือเปล่าที่นี่เป็นวิธีแก้ปัญหา?
Christine

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


ใช้งานได้ดีและฉันเพิ่งเพิ่มไว้ด้านล่างเพื่อซ่อนรายการแบบหล่นลงหลังจากเลือก "$ (นี้) .parents (". btn-group "). find ('. selection'). text ($ (this) .text ()). end () .children ('.dropdown-toggle'). dropdown ('toggle'); "
Senthil

4
อัปเดตสำหรับ Bootstrap 3.3.4: parent (". input-group-btn") จะต้องถูกแทนที่ด้วย
parent

7
นี่ควรเป็นคำตอบที่ยอมรับหลังจากมีการเพิ่มการเปลี่ยนแปลงที่แนะนำโดย @cincplug นอกจากนี้หากคุณต้องการรักษาคาเรต์ลงบนข้อความของปุ่มคุณจะต้องใช้. html แทน. text และเชื่อมต่อสแปนเข้า$(this).text()ด้วยกัน
MattD

@MattD ฉันหวังว่าฉันจะได้เห็นความคิดเห็นของคุณก่อนที่ฉันจะแสดงความคิดเห็นในคำตอบที่ยอมรับ - คุณเป็นจุดบน
เปาโล

3
ฉันขอแนะนำให้เก็บไว้$(this).parents(".dropdown").find('.btn')ในตัวแปรแทนที่จะให้ jQuery เข้าไปใน DOM สองครั้ง
Adam

29

ฉันสามารถปรับปรุงคำตอบของ Jai ให้ทำงานในกรณีที่คุณมีปุ่มดร็อปมากกว่าหนึ่งปุ่มพร้อมการนำเสนอที่ดีงามซึ่งทำงานกับ bootstrap 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 ไปที่ class "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 นาทีในการอ่านวิธีแก้ปัญหาอื่นทั้งหมด
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

เมื่อผู้ใช้เลือกตัวเลือก "var selText = $ (นี่) .children (" h4 "). html ()" เปลี่ยนข้อความ
Oskar

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 ไม่ได้ถูกกำหนด" ในโหมดเข้มงวด
Ivan Topić

อีวานคุณพบอะไรที่ทำงานในโหมดเข้มงวดหรือไม่?
เลขศูนย์และ

วิธีนี้ใช้งานได้ดีสำหรับหลายรายการแบบหล่นลงบนหน้าเดียวกัน ขอบคุณ!
มิทช์


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

ดูเหมือนว่าจะเป็นปัญหาที่ยาวนาน สิ่งที่เราต้องการเพียงแค่ใช้แท็กเลือกในกลุ่มอินพุต แต่ bootstrap จะไม่ทำ: https://github.com/twbs/bootstrap/issues/10486

เคล็ดลับเพียงเพิ่มคลาส "กลุ่ม btn" ลงใน div parent

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'และรับอีกครั้ง

ลองเพิ่ม data-selected-item = 'true'สำหรับองค์ประกอบ liที่คุณคลิกจากนั้น

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

ก่อนที่จะเพิ่มคุณสมบัตินี้คุณเพียงแค่ลบรายการที่เลือกข้อมูลที่มีอยู่ในรายการ หวังว่านี่จะช่วยคุณได้

สำหรับข้อมูลเกี่ยวกับการใช้แอตทริบิวต์ data ใน jQuery โปรดดูข้อมูล jQuery


สวัสดี Murali, ขอบคุณสำหรับความคิดเห็นของคุณฉันลองนี้ แต่ก็ยังไม่ได้รับสิ่งใดที่var test = $('ul.dropdown-menu li').data('selected-item').find('a').text(); $("#nbtn").html(test); คุณกรุณาแจ้งให้เราทราบว่าฉันกำลังทำอะไรผิดหรือเปล่า?
Suffii

โปรดดูคำตอบที่อัพเดต ฉันเปลี่ยนรหัสเป็น $ ('ul.dropdown-menu li [data-Selected-item] a'). text (); ลองสิ่งนี้
Murali Murugesan

0

ฉันต้องวางจาวาสคริปต์ที่ปรากฏด้านบนไว้ในรหัส "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.