2012-07-23 14 views
45

Ich habe eine Schaltfläche Dropdown (nur eine, nicht alle von ihnen), und innerhalb davon möchte ich mehrere Eingabefelder haben, in denen Leute Zeug ohne das Dropdown verstecken als eingeben können sobald Sie darauf klicken (aber es schließt, wenn Sie außerhalb klicken).Stoppt nur einen Dropdown-Schalter vom Schließen auf Klick

habe ich eine jsfiddle: http://jsfiddle.net/denislexic/8afrw/2/

Und hier ist der Code, es ist basic:

<div class="btn-group" style="margin-left:20px;"> 
    <a class="btn dropdown-toggle" data-toggle="dropdown" href="#"> 
    Action 
    <span class="caret"></span> 
    </a> 
    <ul class="dropdown-menu"> 
    <!-- dropdown menu links --> 
     <li>Email<input type="text" place-holder="Type here" /></li> 
     <li>Password<input type="text" place-holder="Type here" /></li> 
    </ul> 
</div>​ 

Also im Grunde, ich will es nicht auf Klick auf den Dropdown schließen (aber in der Nähe auf Klick die Aktionstaste oder außerhalb des Dropdown-Menüs). Meine beste Vermutung war bisher, eine Klasse hinzuzufügen und zu versuchen, etwas JS zu machen, aber ich konnte es nicht herausfinden.

Danke für jede Hilfe.

Antwort

110

Das Problem ist, dass das Bountrap-Dropdown-jQuery-Plugin das Drop-down-Menü schließt, wenn Sie irgendwo anders klicken. Sie können dieses Verhalten deaktivieren, indem Sie die Klickereignisse in Ihrem Dropdown-Menüelement erfassen und verhindern, dass die Klickereignis-Listener im body-Element erreicht werden.

Fügen Sie einfach

$('.dropdown-menu').click(function(event){ 
    event.stopPropagation(); 
});​ 

jsfiddle here

+2

Erstaunlich, ich zwickte es ein bisschen, weil ich nur einige Dropdowns brauche, um das normale Verhalten nicht zu tun, indem ich eine Klasse hinzufüge und es in deinem Code überprüfe ... siehe Geige, wenn interessiert. http://jsfiddle.net/denislexic/8afrw/8/ – denislexic

+2

Sie können auch nur Klicks auf eine bestimmte Klasse blockieren, so dass Sie die normalen Dropdown-Menüs in Ruhe lassen. [js Geige hier] (http://jsfiddle.net/8afrwig/9/) – CraigTeegarden

+0

ha, ja, das ist viel einfacher, danke. – denislexic

39

gefunden werden kann Ich weiß, diese Frage nicht für Angular per se ist, sondern für jeden Winkel verwenden Sie das Ereignis aus der HTML passieren kann und die Ausbreitung stoppen über $ event:

<div ng-click="$event.stopPropagation();"> 
    <span>Content example</span> 
</div> 
+0

Parlament, große Antwort! Ich frage mich, wie Sie die Klicks außerhalb des Menüs fangen können ... – Urigo

+0

Sie sind ein Lebensretter. Danke vielmals. – sfendell

+0

Gern geschehen eine Tonne :) – parliament

1

Nachdem viele Techniken versuchen, fand ich, dass die beste zu verwenden, die bewirkt, dass keine Nachteile, die auch einfach:

$(document) 
.on('click', '.dropdown-menu', function (e){ 
    e.stopPropagation(); 
}); 

Sie können auch einige Live-Bindung für innere Elemente innerhalb von Dropdowns tun.

+0

beste Lösung für mich –

0

auch verhindern, klicken Sie auf, es sei denn auf eine Schaltfläche klickt Element

$('.dropdown-menu').click(function(e) { 
    if (e.target.nodeName !== 'BUTTON') e.stopPropagation(); 
}); 
5

Eigentlich, wenn Sie in Angularjs wäre, wäre es eleganter sein, eine Richtlinie für sie zu machen:

app.directive('stopClickPropagation', function() { 
    return { 
     restrict: 'A', 
     link: function(scope, element) { 
      element.click(function(e) { 
       e.stopPropagation(); 
      }); 
     } 
    }; 
}); 

Und Fügen Sie dann im Dropdown-Menü die folgende Direktive hinzu:

<div class="dropdown-menu" stop-click-propagation> 
    my dropdown content... 
<div> 

Besonders wenn Sie die Propagierung für multipl stoppen wollen e Mausereignisse:

... 
element.click(function(e) { 
    e.stopPropagation(); 
}); 

element.mousedown(... 
element.mouseup(... 
... 
5

Eine weitere schnelle Lösung, fügen Sie einfach onclick Attributklasse div mit dropdown-menu:

<div class="dropdown-menu" onClick="event.stopPropagation();">...</div> 
0

ich dieses Problem hatte, aber in einer Komponente reagieren - die reagieren Komponente in einem Bootstrap-Drop-Down war Menü mit einem Formular. Jedes Mal, wenn auf ein Element im Dropdown-Menü geklickt wurde, wurde es geschlossen, was zu Problemen bei der Eingabe von Elementen im Formular führte.

Die üblichen e.preventDefault() und e.stopPropagation() würden in der reaktiven App nicht funktionieren, da das jquery-Ereignis sofort ausgelöst wird und darauf zu reagieren versucht.

Der folgende Code erlaubte mir, mein Problem zu beheben.

stopPropagation: function(e){ 
    e.nativeEvent.stopImmediatePropagation(); 
} 

oder in ES6 Format

stopPropagation(e){ 
    e.nativeEvent.stopImmediatePropagation(); 
} 

Hope this Nutzungs jemand mit den anderen Antworten zu kämpfen sein kann, wenn sie versuchen es in zu verwenden, reagieren.

Verwandte Themen