2012-05-07 59 views
61

我使用引導下拉菜單作爲購物車。購物車中有一個「刪除產品」按鈕(鏈接)。如果我點擊它,我的購物車腳本將刪除該產品,但菜單消失。有沒有辦法來防止這種情況?我試過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撥動」塔元素使它下拉。另一個想法是,我只是以編程方式重新打開它。所以,如果有人能解釋我如何以編程方式打開Bootstrap下拉菜單,這將有所幫助!

+1

我看你已經有一個答案,但有一個更簡單的方法。只需在表單標籤中包裝菜單的內容即可。而已。 因此,不要使用'ul.dropdown-menu',而是使用'form.dropdown-menu> ul'。 – rdumont

回答

82

嘗試在按鈕本身去除傳播像這樣:

$('.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> 
+0

好的,這個工作,但現在刪除按鈕不工作了,我可以想到我的自我。所以可能我需要以編程方式重新打開div。任何想法如何做到這一點? –

+0

@MartenSytema,這一切都取決於你如何從菜單中刪除產品,但以此爲例:http://jsfiddle.net/andresilich/E9mpu/,請注意我是如何實現'.stopPropagation()'方法與刪除腳本。 –

+0

感謝您的幫助!唯一的問題是我需要使用實時jquery方法來綁定click事件,正如jQuery所說:_Sive()方法處理事件,一旦它們傳播到文檔的頂部,就不可能停止傳播現場活動。[鏈接](http://api.jquery.com/event.stopPropagation/) –

29

這個答案只是一個旁註,以接受的答案。感謝這個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>標籤或它的子元素的任何地方屬性,根據您的情況。 EG:

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

我是有一個手風琴/切換被嵌套在引導3下拉菜單從source code借用了這個語法內停止所有坍塌關閉下拉切換子菜單同樣的問題:

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

您可以替換[data-toggle="collapse"]與任何你想停止關閉形式,類似於@DonamiteIsTnt怎麼加屬性這麼做。

11

總之,你可以試試這個。它爲我工作。

<span class="product-remove"> 
    <a class="removefromcart" onclick=" event.stopPropagation();" packageid="4" href="#">x</a> 
    </span> 
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); 
}); 
0

在引導4,當你把一個表格的下拉菜單裏,點擊內部時它不會崩潰。

所以這個工作最適合我:

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