Сохранять раскрывающийся список Bootstrap на клике
Я использую раскрывающееся меню начальной загрузки в качестве корзины покупок. В корзине находится кнопка "удалить продукт" (ссылка). Если я нажму на него, моя корзина script удалит продукт, но меню исчезнет. Есть ли способ предотвратить это? Я попробовал 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:
€ 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: € 43,00</a></li>
<li><a href="/checkout">Checkout</a></li>
</ul>
</li>
</ul>
Как вы видите, элемент с class= "dropwdown-toggle" сделал его выпадающим списком. Другая идея заключалась в том, что я просто открываю ее, щелкая программно. Поэтому, если кто-то может объяснить мне, как программно открыть раскрывающийся список Bootstrap, это поможет!
Ответы
Ответ 1
Попробуйте удалить распространение на самой кнопке так:
$('.dropdown-menu a.removefromcart').click(function(e) {
e.stopPropagation();
});
Edit
Ниже приведена демонстрация комментариев с приведенным выше решением:
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:
€ 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: € 43,00</a></li>
<li><a href="/checkout">Checkout</a></li>
</ul>
</li>
</ul>
Ответ 2
Этот ответ является лишь побочным эффектом принятого ответа. Благодаря OP и Andres для этого Q и A он решил мою проблему. Позже, однако, мне нужно было что-то, что работало с динамически добавленными элементами в моем раскрывающемся списке. Любой, кто сталкивается с этим, может также быть заинтересован в варианте решения Андреса, которое работает как с исходными элементами, так и с элементами, добавленными в раскрывающийся список после загрузки страницы:
$(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>
Ответ 3
Короче говоря, вы можете попробовать это. Он работает для меня.
<span class="product-remove">
<a class="removefromcart" onclick=" event.stopPropagation();" packageid="4" href="#">x</a>
</span>
Ответ 4
У меня была та же проблема с подменю аккордеона/переключения, которое было вложено в выпадающее меню в Bootstrap 3. Заимствовал этот синтаксис из source код, чтобы остановить все срывы, чтобы закрыть окно:
$(document).on(
'click.bs.dropdown.data-api',
'[data-toggle="collapse"]',
function (e) { e.stopPropagation() }
);
Вы можете заменить [data-toggle="collapse"]
тем, что вы хотите прекратить закрывать форму, подобно тому, как @DonamiteIsTnt добавил свойство для этого.
Ответ 5
Я написал несколько строк кода, которые делают его идеальным, как нам нужно, с большим количеством контроля над ним:
$(".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);
});
Ответ 6
В бутстрапе 4, когда вы вставляете форму в раскрывающееся меню, она не рушится при нажатии внутри нее.
Итак, это сработало лучше для меня:
<div class="dropdown">
<!-- toggle button/link -->
<div class="dropdown-menu">
<form>
<!-- content -->
</form>
</div>
</div>