Я использую раскрывающийся список начальной загрузки как тележку для покупок. В корзине есть кнопка «удалить товар» (ссылка). Если я щелкну по нему, мой скрипт корзины удалит продукт, но меню исчезнет. Есть ли способ предотвратить это? Я пробовал 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, это хорошо поможет!
jquery
twitter-bootstrap
Куница Sytema
источник
источник
ul.dropdown-menu
использованияform.dropdown-menu>ul
.Ответы:
Попробуйте убрать распространение на самой кнопке вот так:
$('.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: € 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>
источник
.stopPropagation()
метод вместе со сценарием удаления..live()
не рекомендуется использовать jQuery версии 1.7..live()
был заменен на.on()
.Этот ответ является лишь дополнением к принятому ответу. Спасибо 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>
источник
В начальной загрузке 4, когда вы помещаете форму в раскрывающееся меню, она не разрушается при нажатии внутри нее.
Так что это сработало для меня лучше всего:
<div class="dropdown"> <!-- toggle button/link --> <div class="dropdown-menu"> <form> <!-- content --> </form> </div> </div>
источник
Короче можно попробовать это. У меня это работает.
<span class="product-remove"> <a class="removefromcart" onclick=" event.stopPropagation();" packageid="4" href="#">x</a> </span>
источник
Меню открывается, когда вы даете
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') })
Попробуйте это в коде .
источник
У меня была такая же проблема с подменю аккордеона / переключателя, которое было вложено в раскрывающееся меню в Bootstrap 3. Этот синтаксис был заимствован из исходного кода, чтобы все переключатели сворачивания не закрывали раскрывающийся список:
$(document).on( 'click.bs.dropdown.data-api', '[data-toggle="collapse"]', function (e) { e.stopPropagation() } );
Вы можете заменить
[data-toggle="collapse"]
все, что хотите, чтобы форма перестала закрывать, аналогично тому, как @DonamiteIsTnt добавил свойство для этого.источник
Я написал несколько строк кода, благодаря которым он работает настолько идеально, насколько нам нужно, с большим контролем над ним:
$(".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); });
источник