Penangan acara untuk dropdown Twitter Bootstrap?

87

Saya ingin menggunakan tombol tarik-turun Bootstrap Twitter :

    <div class="btn-group">
      <button class="btn dropdown-toggle" data-toggle="dropdown">Action <span class="caret"></span></button>
      <ul class="dropdown-menu">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
      </ul>
    </div><!-- /btn-group -->

Saat pengguna mengubah nilai tombol menjadi 'Tindakan lain', daripada sekadar menavigasi ke #, saya sebenarnya ingin menangani tindakan tersebut dengan cara khusus.

Tapi saya tidak bisa melihat penangan acara di plugin dropdown untuk melakukan ini.

Apakah mungkin menggunakan tombol dropdown Bootstrap untuk menangani tindakan pengguna? Saya mulai bertanya-tanya apakah mereka hanya ditujukan untuk navigasi - membingungkan bahwa contoh memberikan daftar tindakan.

Richard
sumber
1
Tidakkah fungsi yang dipicu saat diklik dari tag anchor berfungsi?
Cameron Chapman
Pertama, ini bukan tombol apa pun, ini adalah jangkar. Anda dapat melihat event handler dengan memeriksa file bootstrap.js. Tetapi sejauh yang saya tahu semua tindakan ini diproses dengan jQuery jadi seharusnya tidak menjadi masalah besar untuk mengedit atau mengganti fungsi ini.
desain-mas

Jawaban:

78

Bootstrap Twitter dimaksudkan untuk memberikan fungsionalitas dasar, dan hanya menyediakan plugin javascript dasar yang melakukan sesuatu di layar . Konten atau fungsi tambahan apa pun, Anda harus melakukannya sendiri.

<div class="btn-group">
  <button class="btn dropdown-toggle" data-toggle="dropdown">Action <span class="caret"></span></button>
  <ul class="dropdown-menu">
    <li><a href="#" id="action-1">Action</a></li>
    <li><a href="#" id="action-2">Another action</a></li>
    <li><a href="#" id="action-3">Something else here</a></li>
  </ul>
</div><!-- /btn-group -->

dan kemudian dengan jQuery

jQuery("#action-1").click(function(e){
//do something
e.preventDefault();
});
Thomas Jones
sumber
1
Mencoba itu, bagaimanapun, tidak ada acara yang dipecat. Saya bisa menangkap peristiwa mengklik tombol sekalipun. Apa lagi yang mungkin menghalangi?
Kunci Inggris
1
@Ronnieilsbo tidak yakin. Solusi ini berfungsi seperti yang dinyatakan, dan saya telah menggunakannya berkali-kali. Anda mungkin tidak mengatur id jangkar Anda dengan benar, atau Anda mungkin mengikat sebelum elemen ada - Saya sangat merekomendasikan menggunakan jQuery dalam kasus ini.
Thomas Jones
1
Anda benar, saya buruk. Saya telah memasukkan elemen di DOM setelah saya mengikat file yang dapat diklik dengan jQuery, yang merupakan hal yang buruk. :) Bekerja, dikonfirmasi.
Kunci inggris
18

Coba ini:

$('div.btn-group ul.dropdown-menu li a').click(function (e) {
    var $div = $(this).parent().parent().parent(); 
    var $btn = $div.find('button');
    $btn.html($(this).text() + ' <span class="caret"></span>');
    $div.removeClass('open');
    e.preventDefault();
    return false;
});
Fernando
sumber
14

Dalam Bootstrap 3 'dropdown.js' memberi kita berbagai peristiwa yang dipicu.

click.bs.dropdown
show.bs.dropdown
shown.bs.dropdown

dll

Stevanicus
sumber
1
Itu benar, tetapi Anda masih tidak bekerja dalam kerangka bootstrap untuk memasang penangan kejadian. Anda melakukannya sendiri. Bootstrap selalu tentang melakukan berbagai hal di layar, bukan menyediakan fungsionalitas khusus. Diasumsikan bahwa dev akan dapat menghubungkan peristiwa dropdown mereka sendiri.
Thomas Jones
8

Berikut adalah contoh kerja bagaimana Anda dapat mengimplementasikan fungsi kustom untuk jangkar Anda.

http://jsfiddle.net/CH2NZ/43/

Anda dapat melampirkan id ke jangkar Anda:

<li><a id="alertMe" href="#">Action</a></li>

Dan kemudian gunakan pendengar peristiwa klik jQuery untuk mendengarkan aksi klik dan aktifkan fungsi Anda:

$('#alertMe').click(function(e) {
    alert('alerted');
    e.preventDefault();// prevent the default anchor functionality
});
Cameron Chapman
sumber
Contoh di atas sepertinya tidak ada lagi di jsfiddle.
Ethereal
Saya menambahkan contoh baru dengan tautan yang valid. Terima kasih @ethereal.
Cameron Chapman
4

Saya telah melihat ini. Saat mengisi jangkar drop-down, saya telah memberi mereka atribut kelas dan data, jadi ketika perlu melakukan tindakan, Anda dapat melakukan:

<li><a class="dropDownListItem" data-name="Fred Smith" href="#">Fred</a></li>

dan kemudian di jQuery melakukan sesuatu seperti:

$('.dropDownListItem').click(function(e) {
    var name = e.currentTarget;
    console.log(name.getAttribute("data-name"));
});

Jadi, jika Anda telah membuat item daftar secara dinamis di tarik-turun dan perlu menggunakan data yang bukan hanya nilai teks dari item tersebut, Anda dapat menggunakan atribut data saat membuat item daftar tarik-turun dan kemudian hanya memberikan setiap item dengan kelas acara, daripada merujuk ke id setiap item dan menghasilkan peristiwa klik.

Andrew Berry
sumber
3

Siapapun di sini yang mencari integrasi Knockout JS.

Diberikan HTML berikut (tombol dropdown Bootstrap Standar):

<div class="dropdown">
    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
        Select an item               
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" role="menu">
        <li>
            <a href="javascript:;" data-bind="click: clickTest">Click 1</a>
        </li>
        <li>
            <a href="javascript:;" data-bind="click: clickTest">Click 2</a>
        </li>
        <li>
            <a href="javascript:;" data-bind="click: clickTest">Click 3</a>
        </li>
    </ul>
</div>

Gunakan JS berikut:

var viewModel = function(){
    var self = this;

    self.clickTest = function(){
        alert("I've been clicked!");
    }  
};

Bagi mereka yang ingin menghasilkan opsi dropdown berdasarkan knockout observable array, kodenya akan terlihat seperti:

var viewModel = function(){
    var self = this;

    self.dropdownOptions = ko.observableArray([
        { id: 1, label: "Click 1" },
        { id: 2, label: "Click 2" },
        { id: 3, label: "Click 3" }
    ])

    self.clickTest = function(item){
        alert("Item with id:" + item.id + " was clicked!");
    }  
};

<!-- REST OF DD CODE -->
<ul class="dropdown-menu" role="menu">
    <!-- ko foreach: { data: dropdownOptions, as: 'option' } -->
    <li>
        <a href="javascript:;" data-bind="click: $parent.clickTest, text: option.clickTest"></a>
    </li>
    <!-- /ko -->
</ul>
<!-- REST OF DD CODE -->

Perhatikan, item larik yang dapat diamati secara implisit diteruskan ke pengendali fungsi klik untuk digunakan dalam kode model tampilan.

pim
sumber
3

Tanpa harus mengubah grup tombol Anda sama sekali, Anda dapat melakukan hal berikut. Di bawah ini, saya menganggap dropdown Anda buttonmemiliki iddari fldCategory.

<script type="text/javascript">

$(document).ready(function(){

  $('#fldCategory').parent().find('UL LI A').click(function (e) {
    var sVal = e.currentTarget.text;
    $('#fldCategory').html(sVal + ' <span class="caret"></span>');
    console.log(sVal);
  });

});

</script>

Sekarang, jika Anda menyetel .btn-groupitem ini sendiri menjadi iddari fldCategory, itu sebenarnya lebih efisien jQuery dan berjalan sedikit lebih cepat:

<script type="text/javascript">

$(document).ready(function(){

  $('#fldCategory UL LI A').click(function (e) {
    var sVal = e.currentTarget.text;
    $('#fldCategory BUTTON').html(sVal + ' <span class="caret"></span>');
    console.log(sVal);
  });

});

</script>
Volomike
sumber
Ha! Terima kasih, itu bagus! :) Saya menggunakan contoh kedua Anda.
drzounds
ini seharusnya jawabannya!
Jake