Biarkan dropdown Bootstrap terbuka saat diklik

85

Saya menggunakan dropdown bootstrap sebagai kereta belanja. Di keranjang belanja ada tombol 'hapus produk' (tautan). Jika saya mengkliknya, skrip kereta belanja saya menghapus produk, tetapi menu memudar. Apakah ada cara untuk mencegahnya? Saya mencoba e.startPropagation, tetapi tampaknya tidak berhasil:

<div id="shoppingcart" class="nav-collapse cart-collapse">
 <ul class="nav pull-right">
  <li class="dropdown open">
    <a href="#" data-toggle="dropdown" class="dropdown-toggle">Totaal:
    &acirc;&sbquo;&not; 43,00</a>

    <ul class="dropdown-menu">
      <li class="nav-header">Pakketten</li>

      <li>
       <span class="quantity">1x</span>
       <span class="product-name">Test Product </span>
       <span class="product-remove"><a class="removefromcart" packageid="4" href="#">x</a>
        </span></li>

      <li><a href="#">Total: &euro; 43,00</a></li>

      <li><a href="/checkout">Checkout</a></li>
    </ul>
  </li>
</ul>

Seperti yang Anda lihat, elemen dengan class = "dropwdown-toggle" membuatnya menjadi dropdown. Ide lainnya adalah saya hanya membukanya kembali dengan mengklik secara terprogram. Jadi, jika seseorang dapat menjelaskan kepada saya cara membuka dropdown Bootstrap secara terprogram, itu akan membantu dengan baik!

Sytema Marten
sumber
1
Saya melihat Anda sudah memiliki jawabannya, tetapi ada cara yang jauh lebih sederhana. Cukup bungkus konten menu dalam tag formulir. Itu dia. Jadi, alih-alih ul.dropdown-menu, gunakan form.dropdown-menu>ul.
rdumont

Jawaban:

101

Coba hapus propagasi pada tombol itu sendiri seperti:

$('.dropdown-menu a.removefromcart').click(function(e) {
    e.stopPropagation();
});

Sunting

Berikut ini demo dari komentar dengan solusi di atas:

http://jsfiddle.net/andresilich/E9mpu/

Kode yang relevan:

JS

$(".removefromcart").on("click", function(e){
    var fadeDelete = $(this).parents('.product');
    $(fadeDelete).fadeOut(function() {
        $(this).remove();
    });

    e.stopPropagation();
});

HTML

<div id="shoppingcart" class="nav-collapse cart-collapse">
 <ul class="nav pull-right">
  <li class="dropdown open">
    <a href="#" data-toggle="dropdown" class="dropdown-toggle">Totaal:
    &acirc;&sbquo;&not; 43,00</a>

    <ul class="dropdown-menu">
      <li class="nav-header">Pakketten</li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">1</span></span>
        </li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">10</span></span>
        </li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">8</span></span>
        </li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">3</span></span>
        </li>
        <li class="product">
            <span class="product-remove"><a class="removefromcart" packageid="2" href="#"><i class="icon-remove"></i></a></span>
            <span class="product-name">Test Product </span>
            <span class="quantity"><span class="badge badge-inverse">4</span></span>
        </li>
        <li class="divider"></li>
        <li><a href="#">Total: &euro; 43,00</a></li>
        <li><a href="/checkout">Checkout</a></li>
    </ul>
  </li>
</ul>
Andres Ilich
sumber
Oke, ini berfungsi, tetapi sekarang tombol hapus tidak berfungsi lagi, yang saya pikirkan tentang diri saya sendiri. Jadi mungkin AKU perlu membuka kembali div secara terprogram. Ada ide bagaimana melakukan itu?
Marten Sytema
@MartenSytema itu semua tergantung pada bagaimana Anda menghapus produk dari menu, tetapi ambil ini sebagai contoh: jsfiddle.net/andresilich/E9mpu , perhatikan bagaimana saya mengimplementasikan .stopPropagation()metode bersama dengan skrip penghapusan.
Andres Ilich
Terima kasih telah membantu! Satu-satunya masalah adalah di sana saya perlu menggunakan metode jquery langsung untuk mengikat acara klik, dan seperti yang dikatakan jQuery: Karena metode .live () menangani peristiwa setelah mereka disebarkan ke bagian atas dokumen, itu tidak mungkin untuk hentikan penyebaran siaran langsung. tautan
Marten Sytema
@MartenSytema kedua metode melakukan hal yang sama. Juga, .live()sudah tidak digunakan lagi mulai jQuery versi 1.7.
Andres Ilich
@MartenSytema lupa menyebutkan, .live()digantikan oleh .on().
Andres Ilich
36

Jawaban ini hanyalah sidenote dari jawaban yang diterima. Terima kasih kepada OP dan Andres untuk Tanya Jawab ini, ini menyelesaikan masalah saya. Namun, kemudian, saya membutuhkan sesuatu yang berfungsi dengan item yang ditambahkan secara dinamis di dropdown saya. Siapa pun yang menemukan yang satu ini mungkin juga tertarik dengan variasi solusi Andres yang berfungsi baik dengan elemen awal serta elemen yang ditambahkan ke drop-down setelah halaman dimuat:

$(function() {
    $("ul.dropdown-menu").on("click", "[data-keepOpenOnClick]", function(e) {
        e.stopPropagation();
    });
});

Atau, untuk menu tarik-turun yang dibuat secara dinamis:

$(document).delegate("ul.dropdown-menu [data-keepOpenOnClick]", "click", function(e) {
    e.stopPropagation();
});

Kemudian letakkan data-keepOpenOnClickatribut di mana saja di salah satu <li>tag atau elemen turunannya, bergantung pada situasi Anda. MISALNYA:

<ul class="dropdown-menu">
    <li>
        <-- EG 1: Do not close when clicking on the link -->
        <a href="#" data-keepOpenOnClick>
            ...
        </a>
    </li>
    <li>
        <-- EG 2: Do not close when clicking the checkbox -->
        <input type="checkbox" data-keepOpenOnClick> Pizza
    </li>

    <-- EG 3: Do not close when clicking the entire LI -->
    <li data-keepOpenOnClick>
        ...
    </li>
</ul>
uɥƃnɐʌuop
sumber
24

Pada bootstrap 4, saat Anda meletakkan formulir di dalam menu dropdown, formulir tidak akan runtuh saat mengklik di dalamnya.

Jadi ini paling berhasil untuk saya:

<div class="dropdown">
    <!-- toggle button/link -->
    <div class="dropdown-menu">
        <form>
            <!-- content -->
        </form>
    </div>
</div>
Hugo Mota
sumber
4
Tidak tahu bagaimana tetapi ini berhasil dan harus menjadi jawaban teratas.
Dimitri Mostrey
3
Terima kasih banyak karena telah memberikan jawaban yang tidak menggunakan jQuery! Bekerja seperti pesona.
Mladen Ristic
13

Singkatnya, Anda bisa mencoba ini. Ini bekerja untuk saya.

<span class="product-remove">
  <a class="removefromcart" onclick=" event.stopPropagation();" packageid="4" href="#">x</a>
  </span>

sumber
3

Menu terbuka saat Anda memberikan showkelas ke menu, sehingga Anda dapat mengimplementasikan sendiri fungsi tersebut tanpa menggunakan data-toggle="dropdown".

<div class="dropdown">
  <button class="btn btn-secondary" type="button">
    Dropdown button
  </button>
  <div class="dropdown-menu">
    <a class="dropdown-item" href="#">Action</a>
    <a class="dropdown-item" href="#">Another action</a>
    <a class="dropdown-item" href="#">Something else here</a>
  </div>
</div>
<div id="overlay"></div>
#overlay{
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  z-index: 1000;
  display: none;
}

#overlay.show{
  display: block;
}

.dropdown-menu{
  z-index: 1001;
}
$('button, #overlay').on('click', function(){
  $('.dropdown-menu, #overlay').toggleClass('show')
})

Coba ini di codepen .

Masamoto Miyata
sumber
2

Saya mengalami masalah yang sama dengan sub-menu akordeon / toggle yang bersarang dalam menu dropdown di Bootstrap 3. Meminjam sintaks ini dari kode sumber untuk menghentikan semua toggle yang diciutkan agar tidak menutup dropdown:

$(document).on(
    'click.bs.dropdown.data-api', 
    '[data-toggle="collapse"]', 
    function (e) { e.stopPropagation() }
);

Anda dapat mengganti [data-toggle="collapse"]dengan apa pun yang Anda inginkan untuk berhenti menutup formulir, mirip dengan cara @DonamiteIsTnt menambahkan properti untuk melakukannya.

Astockwell
sumber
1

Saya menulis beberapa baris kode yang membuatnya berfungsi sesempurna yang kita butuhkan dengan lebih banyak kontrol di atasnya:

$(".dropdown_select").on('hidden.bs.dropdown', function () {
    if($(this).attr("keep-open") == "true") {
        $(this).addClass("open");
        $(this).removeAttr("keep-open");
    }
});

$(".dropdown_select ul li").bind("click", function (e) {
    // DO WHATEVER YOU WANT
    $(".dropdown_select").attr("keep-open", true);
});
pengguna2991574
sumber