Das Bootstrap-Dropdown-Menü wird beim Klicken geschlossen

75

Ich habe ein Formular in ein Bootstrap-Dropdown-Menü eingefügt, aber wenn ich auf eines der Felder im Formular klicke, wird das Dropdown-Menü ausgeblendet. Ich habe diesen Code, weiß aber nicht, wo ich ihn ablegen soll, um zu verhindern, dass das Dropdown-Menü verschwindet.

$(function test() {
  // Setup drop down menu
  $('.dropdown-toggle').dropdown();

  // Fix input element click problem
  $('.dropdown input, .dropdown label').click(function(e) {
    e.stopPropagation();
  });
});

Könnte mir bitte jemand sagen, wo ich das hinstellen soll? Ich habe es im Bootstrap-Dropdown versucht, ich habe es im HTML versucht, aber es funktioniert immer noch nicht.

Sorin Cioban
quelle

Antworten:

4

Verwenden Sie einfach dieses Beispiel. Diese Lösung funktioniert für mich.

<script type="text/javascript">
window.addEvent('domready',function() {    
   Element.prototype.hide = function() {
      $(function () { 
        // replace your tab id with myTab
        //<ul id="myTab" class="nav nav-tabs">
        $('#myTab li:eq(1) a').tab('show');
      });      
   };
});
</script>

Hoffe es wird helfen. Vielen Dank.

Shiplu
quelle
124

Sie können den Dropdown-Aufruf insgesamt weglassen, das Bootstrap-Dropdown funktioniert ohne ihn. Stellen Sie sicher, dass Sie Ihr Skript richtig verpacken. Sie können es in die Kopfzeile oder den Hauptteil Ihrer Seite aufnehmen, obwohl ich es persönlich lieber auf den Hauptteil Ihrer Seite setze.

JS

<script type="text/javascript">
    $('.dropdown-menu input, .dropdown-menu label').click(function(e) {
        e.stopPropagation();
    });
</script>
Andres Ilich
quelle
Ich habe es in den Körper gelegt und es funktioniert immer noch nicht. Kann ich es einfach nach <body> und vor meinem ersten <div> setzen?
Sorin Cioban
@ SorinCioban Aus welchen Formularelementen möchten Sie die Weitergabe des Klickereignisses stoppen? Die oberste Zeile zielt nur auf die Eingabe- und Beschriftungsformularelemente ab. Gibt es andere Formularelemente in Ihrem Dropdown-Formular? Ist der .dropdown-menuContainer auch ein übergeordnetes Element Ihrer Formularelemente?
Andres Ilich
2
Es ist jetzt in Ordnung. Ich habe das Skript nicht an der richtigen Stelle platziert. Außerdem brauchte ich das $ ('. Dropdown-toggle'). Dropdown (); Aussage, weil ich ein Formular in der Dropdown-Liste hatte. Ohne sie würden sich die Variablen in dem Skript, das ich für das Formular verwende, nicht an $ _POST weitergeben.
Sorin Cioban
1
Gibt es eine andere Möglichkeit, dies ohne zu lösen e.stopPropagation();? In meinem Fall habe ich ein Element in meinem Dropdown-Menü, das ein Bestätigungsfeld benötigt, um angezeigt zu werden, nachdem es angeklickt wurde - das Bestätigungsfeld funktioniert nicht, wenn diese Methode aktiv ist
Gcap
10

Wenn Sie aufhören möchten, nur einige der Dropdown-Menüs zu schließen, nicht alle, fügen Sie Ihrem ul-Block einfach eine zusätzliche Klasse hinzu:

<ul class="dropdown-menu keep-open-on-click">

Und benutze diesen Code:

$(document).on('click', '.dropdown-menu', function(e) {
    if ($(this).hasClass('keep-open-on-click')) { e.stopPropagation(); }
});
oleg
quelle
9

Die Zeit, die vergangen ist, seit die Antwort akzeptiert wurde, aber wenn Sie das Dropdown geöffnet lassen möchten, wenn es sich wie eine Art Dialog verhält, denke ich am besten:

$('.dropdown').dropdown().on("hide.bs.dropdown", function(e) {
            if ($.contains(dropdown, e.target)) {
                e.preventDefault();
            //or return false;
            }
        });
Lavrik
quelle
1
Ich habe diesen Ansatz versucht, aber die Dropdown-Liste wird jetzt überhaupt nicht
angezeigt
8

Sie müssen verhindern, dass das Ereignis den DOM-Baum sprudelt:

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

event.stopPropagation verhindert, dass das Ereignis den Knoten erreicht, auf dem es schließlich vom Bootstrap-Ausblendmenü verarbeitet wird.

Vishnu T Asok
quelle
6

Dies funktioniert für meine (seitliche Seitenleiste, die einen einfachen Link mit dem Bootstrap-Umschalter öffnet)

$('.dropdown').find("a").not('.dropdown-toggle').on("click",function(e){
    e.stopImmediatePropagation();
});
manuelprojects
quelle
1
Vielen Dank! Ich mag diesen Ansatz, aber ich musste $ ('Dropdown-Menü') verwenden ... um ihn zum Laufen zu bringen
Gerfried
4

Vielen Dank für die obige Antwort. Ich hatte das gleiche Problem mit Untermenüs unter den Dropdown-Menüs. Mit der obigen Lösung konnte ich das Problem auch dafür lösen.

$('.dropdown-menu .dropdown-submenu a[data-toggle="dropdown-submenu"]').click(function (e)
{                   
    e.stopPropagation();
});
Usugarbage
quelle
4

Stellen

<script type="text/javascript">
    $('.dropdown-menu').click(function(e) {
          e.stopPropagation();
    });
</script>

Entfernen Sie bei der ursprünglichen Antwort alle Klassen und setzen Sie einfach die Klasse ".dropdown-menu" ein. Es hat bei mir funktioniert. Ich habe ein Eingabefeld im Dropdown-Menü.

Screenshot des Menüs

Fluss CR Phoenix
quelle
fantastisch und sehr einfach. Danke Freund
Mahfuz Ahmed
4

Wenn Sie sich die Quellen des Dropdown-Widgets ansehen, sehen Sie Folgendes:

$(document)
  .on('click.bs.dropdown.data-api', '.dropdown form', function(e) {
    e.stopPropagation()
  })

Sie haben also folgende Möglichkeiten:

  1. Wickeln Sie einfach Ihr Dropdown mit Formular
  2. Oder Sie können einen Ereignis-Listener für das Klickereignis von .dropdown YOUR_SELECTOR hinzufügen
$(document)
  .on('click.my', '.dropdown some_selector', function(e) {
    e.stopPropagation()
  })
Timofey Novitskiy
quelle