Открывать раскрывающийся список Bootstrap при нажатии

85

Я использую раскрывающийся список начальной загрузки как тележку для покупок. В корзине есть кнопка «удалить товар» (ссылка). Если я щелкну по нему, мой скрипт корзины удалит продукт, но меню исчезнет. Есть ли способ предотвратить это? Я пробовал 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" превратился в раскрывающийся список. Другая идея заключалась в том, что я просто снова открываю его, щелкая программно. Так что, если кто-нибудь может объяснить мне, как программно открыть раскрывающийся список Bootstrap, это хорошо поможет!

Куница Sytema
источник
1
Я вижу, у вас уже есть ответ, но есть более простой способ. Просто оберните содержимое меню в тег формы. Вот и все. Итак, вместо ul.dropdown-menuиспользования form.dropdown-menu>ul.
rdumont

Ответы:

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
@MartenSytema, все зависит от того, как вы удаляете продукты из меню, но возьмем это для примера: jsfiddle.net/andresilich/E9mpu , обратите внимание, как я реализовал этот .stopPropagation()метод вместе со сценарием удаления.
Андрес Ильич
Спасибо за помощь! Единственная проблема заключается в том, что мне нужно использовать метод live jquery для привязки события щелчка, и, как говорит jQuery: Поскольку метод .live () обрабатывает события после их распространения в верхнюю часть документа, невозможно прекратить распространение прямых трансляций. ссылка
Marten Sytema 07
@MartenSytema оба метода делают то же самое. Кроме того, .live()не рекомендуется использовать jQuery версии 1.7.
Андрес Ильич
@MartenSytema забыл упомянуть, .live()был заменен на .on().
Андрес Ильич
36

Этот ответ является лишь дополнением к принятому ответу. Спасибо OP и 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
Не знаю, как, но это работает, и это должен быть главный ответ.
Димитрий Мостри
Большое спасибо за ответ, в котором не используется 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')
})

Попробуйте это в коде .

Масамото Мията
источник
2

У меня была такая же проблема с подменю аккордеона / переключателя, которое было вложено в раскрывающееся меню в Bootstrap 3. Этот синтаксис был заимствован из исходного кода, чтобы все переключатели сворачивания не закрывали раскрывающийся список:

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

Вы можете заменить [data-toggle="collapse"]все, что хотите, чтобы форма перестала закрывать, аналогично тому, как @DonamiteIsTnt добавил свойство для этого.

Astockwell
источник
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);
});
user2991574
источник