クリック時にブートストラップドロップダウンを開いたままにします


86

ブートストラップドロップダウンをショッピングカートとして使用します。ショッピングカートには、「製品の削除」ボタン(リンク)があります。クリックすると、ショッピングカートスクリプトで商品が削除されますが、メニューが消えてしまいます。とにかくこれを防ぐ方法はありますか?e.startPropagationを試しましたが、うまくいかなかったようです。

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

ご覧のとおり、class = "dropwdown-toggle"の要素がドロップダウンになりました。もう1つのアイデアは、プログラムでクリックして再度開くというものでした。したがって、誰かがプログラムでBootstrapドロップダウンを開く方法を説明できれば、それはうまくいくでしょう!


1
すでに答えがあるようですが、もっと簡単な方法があります。メニューの内容をフォームタグでラップするだけです。それでおしまい。したがって、の代わりにul.dropdown-menu、を使用しますform.dropdown-menu>ul
rdumont 2012年

回答:


100

次のように、ボタン自体の伝播を削除してみてください。

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

編集

上記の解決策のコメントからのデモは次のとおりです。

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

関連コード:

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>

さて、これは機能しますが、削除ボタンが機能しなくなりました。これは私自身の考えでした。したがって、おそらく私はプログラムでdivを再度開く必要があります。それを行う方法はありますか?
Marten Sytema 2012年

@MartenSytemaはすべて、メニューから製品を削除する方法によって異なりますが、たとえばjsfiddle.net/andresilich/E9mpuを例にとる.stopPropagation()と、削除スクリプトとともにメソッドを実装した方法に注意してください。
Andres Ilich 2012年

助けてくれてありがとう!唯一の問題は、クリックイベントをバインドするためにライブjqueryメソッドを使用する必要があることです。jQueryが 言うように:.live()メソッドは、イベントがドキュメントの先頭に伝播されるとイベントを処理するため、ライブイベントの伝播を停止します。リンク
Marten Sytema 2012年

@MartenSytemaどちらの方法も同じことをします。また、 .live()jQueryバージョン1.7で非推奨になりました。
Andres Ilich 2012年

@MartenSytemaは言及するのを忘れ、.live()に置き換えられました.on()
Andres Ilich 2012年

36

この回答は、受け入れられた回答の単なる補足です。このQ&AのOPとAndresの両方のおかげで、私の問題は解決しました。ただし、後で、ドロップダウンに動的に追加されたアイテムを処理するものが必要になりました。これに出くわした人は、最初の要素と、ページが読み込まれた後にドロップダウンに追加された要素の両方で機能するバリエーションAndresのソリューションにも興味があるかもしれません。

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

または、動的に作成されたドロップダウンメニューの場合:

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

次に、状況に応じてdata-keepOpenOnClick<li>タグまたはその子要素の任意の場所に属性を配置します。例えば:

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

20

ブートストラップ4では、ドロップダウンメニュー内にフォームを配置すると、フォーム内をクリックしても折りたたまれません。

だからこれは私にとって最もうまくいきました:

<div class="dropdown">
    <!-- toggle button/link -->
    <div class="dropdown-menu">
        <form>
            <!-- content -->
        </form>
    </div>
</div>

2
方法はわかりませんが、これは機能するので、一番の答えになるはずです。
DimitriMostrey19年

jQueryを使わない答えを実際に提供してくれてありがとう!チャームのように機能します。
ムラデンリスティッチ

13

要するに、あなたはこれを試すことができます。それは私のために働いています。

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

3

メニューにshowクラスを与えるとメニューが開くので、を使わずに自分で関数を実装できます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')
})

codepenでこれを試してください。


2

Bootstrap 3のドロップダウンメニュー内にネストされたアコーディオン/トグルサブメニューでも同じ問題が発生していました。ソースコードからこの構文を借用して、すべての折りたたみトグルがドロップダウンを閉じるのを停止しました。

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

[data-toggle="collapse"]@DonamiteIsTntがプロパティを追加したのと同様に、フォームを閉じるのをやめたいものに置き換えることができます。


1

必要に応じて完全に機能し、より詳細に制御できるようにするコードを数行記述しました。

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