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.

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.


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>

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(); }
});

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;
            }
        });

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.


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();
});

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();
});

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


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()
  })
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.