2012-05-07 21 views
61

Ich verwende ein Bootstrap-Dropdown als Einkaufskorb. Im Einkaufswagen befindet sich ein "Produkt entfernen" -Knopf (ein Link). Wenn ich darauf klicke, entfernt mein Einkaufswagen-Skript das Produkt, aber das Menü wird ausgeblendet. Gibt es einen Weg dies zu verhindern? Ich versuchte e.startPropagation, aber das hat nicht zu funktionieren scheint:Bootstrap Dropdown auf Klick geöffnet

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

Wie Sie tha Element mit class = "dropwdown-Toggle" sehen können, machte es ein Dropdown-Menü. Eine andere Idee war, dass ich sie beim programmgesteuerten Klicken wieder öffne. Wenn mir jemand erklären kann, wie man ein Bootstrap-Drop-Down-Programm programmatisch öffnet, würde das gut helfen!

+1

Ich sehe Sie schon eine Antwort haben, aber es gibt eine viel einfachere Art und Weise. Wickeln Sie einfach den Inhalt des Menüs in ein Formular-Tag. Das ist es. Verwenden Sie also statt 'ul.dropdown-menu'' form.dropdown-menu> ul'. – rdumont

Antwort

82

Versuchen Sie, die Ausbreitung auf die Schaltfläche Entfernen sich wie folgt:

$('.dropdown-menu a.removefromcart').click(function(e) { 
    e.stopPropagation(); 
}); 

bearbeiten

Hier ist eine Demo aus den Kommentaren mit der Lösung oben:

http://jsfiddle.net/andresilich/E9mpu/

Relevanter Code:

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

Okay, das funktioniert, aber jetzt funktioniert der Remove-Button nicht mehr, an den ich selbst gedacht hätte. Also muss ich wahrscheinlich das div programmatisch wieder öffnen. Irgendeine Idee, wie man das macht? –

+0

@MartenSytema, dass alles hängt davon ab, wie Sie die Produkte aus dem Menü entfernen, aber nehmen Sie dies zum Beispiel: http://jsfiddle.net/andresilich/E9mpu, beachten Sie, wie ich die '. StopPropagation()' Methode zusammen implementiert mit dem Entfernungsskript. –

+0

Danke für die Hilfe! Das einzige Problem ist, dass ich die Live-jquery-Methode verwenden muss, um das click-Ereignis zu binden, und wie jQuery sagt: _Da die .live() -Methode Ereignisse behandelt, sobald sie an den Anfang des Dokuments weitergegeben wurden, ist es nicht möglich stoppe die Verbreitung von Live-Events._ [link] (http://api.jquery.com/event.stopPropagation/) –

29

Diese Antwort ist nur eine Bemerkung am Rande auf die akzeptierte Antwort. Dank sowohl der OP und Andres für diese Q & A, löste es mein Problem. Später benötigte ich jedoch etwas, das mit dynamisch hinzugefügten Elementen in meinem Dropdown funktionierte. Wer über diese interessiert vielleicht auch in einer Variation Andres Lösung kommen, die sowohl mit den ersten Elemente sowie Elemente hinzugefügt, um die Drop-Down funktioniert, nachdem die Seite geladen wurde:

$(function() { 
    $("ul.dropdown-menu").on("click", "[data-keepOpenOnClick]", function(e) { 
     e.stopPropagation(); 
    }); 
}); 

Oder für dynamisch erstellte Dropdown-Menüs :

$(document).delegate("ul.dropdown-menu [data-keepOpenOnClick]", "click", function(e) { 
    e.stopPropagation(); 
}); 

Dann setzen Sie einfach die data-keepOpenOnClick irgendwo in einem der <li> Tags oder seine untergeordneten Elemente Attribut, Ihre Situation je nach. Beispiel:

<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

Ich war das gleiche Problem mit einem Akkordeon/wechseln Untermenü, die 3. Borrowed dieser Syntax aus den source code in einem Dropdown-Menü in Bootstrap verschachtelt wurde alle Zusammenbruch zu stoppen schaltet aus der Drop-Down-Schließen :

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

Sie können ersetzen [data-toggle="collapse"] mit dem, was Sie das Formular zu schließen, ähnlich wie @DonamiteIsTnt eine Eigenschaft hinzugefügt zu tun, damit aufhören wollen.

11

Kurz gesagt, Sie können dies versuchen. Es funktioniert für mich.

<span class="product-remove"> 
    <a class="removefromcart" onclick=" event.stopPropagation();" packageid="4" href="#">x</a> 
    </span> 
1

Ich schrieb ein paar Zeilen Code, es funktioniert so perfekt, wie wir mit mehr Kontrolle über sie brauchen:

$(".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

Auf Bootstrap-4, wenn Sie ein Formular in dem Drop-Down-Menü setzen, Es wird nicht kollabieren, wenn Sie darin klicken.

So arbeitete das Beste für mich:

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