单击保持打开Bootstrap下拉菜单


86

我使用bootstrap下拉菜单作为购物车。购物车中有一个“删除产品”按钮(链接)。如果单击它,我的shoppingcart脚本会删除该产品,但菜单会消失。有什么办法可以防止这种情况吗?我尝试了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”的tha元素使其成为一个下拉列表。另一个想法是,我只是以编程方式单击将其重新打开。因此,如果有人可以向我解释如何以编程方式打开Bootstrap下拉菜单,那将很有帮助!


1
我看到您已经有了答案,但是有一种更简单的方法。只需将菜单内容包装在一个表单标签中即可。而已。因此ul.dropdown-menu,请使用代替form.dropdown-menu>ul
rdumont 2012年

Answers:


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()方法以及删除脚本的。
安德烈斯·伊里奇

感谢您的帮助!唯一的问题是,我需要使用实时jquery方法来绑定click事件,正如jQuery所述:由于.live()方法一旦将事件传播到文档顶部,便会对其进行处理,因此无法停止直播活动的传播。 链接
Marten Sytema'5

@MartenSytema两种方法都做同样的事情。另外, .live()从jQuery 1.7版开始不推荐使用。
安德烈斯·伊里奇

@MartenSytema忘记提了,.live()由代替.on()
安德列斯·伊里奇

36

该答案只是已接受答案的旁注。感谢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

在bootstrap 4上,当您将表单放在下拉菜单中时,在其中单击时不会折叠。

所以这对我来说最有效:

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

2
不知道如何,但这确实有效,应该是最佳答案。
Dimitri Mostrey

非常感谢您实际提供了不使用jQuery的答案!奇迹般有效。
Mladen Ristic

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

我是有一个手风琴/肘节被嵌套在引导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);
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.