Twitter Bootstrap Nav ausblenden beim Klicken ausblenden


133

Dies ist kein Dropdown-Menü, die Kategorie ist Klasse li wie im Bild:

Geben Sie hier die Bildbeschreibung ein

Durch Auswahl einer Kategorie aus dem Antwortmenü (die Vorlage ist nur eine Seite) möchte ich den Navigationskollaps beim Klicken automatisch ausblenden. Bummeln Sie auch zur Navigation, da die Vorlage nur eine Seite hat. Ich suche eine Lösung, die sich nicht darauf auswirkt. Hier ist der HTML-Code des Menüs:

    <!-- NAVBAR
  ================================================== -->
<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container">
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      </a>
      <a class="brand" href="#">Carousel Demo</a>
      <div class="nav-collapse">
        <ul class="nav" >
          <li class="active"><a href="#home">Home</a></li>
          <li><a href="#about">About</a></li>
          <li><a href="#portfolio">Portfolio</a></li>
          <li><a href="#services">Services</a></li>
          <li><a href="#contact">Contact</a></li>
          <!-- dropdown -->
        </ul>
        <!-- /.nav -->
      </div>
      <!--/.nav-collapse -->
    </div>
    <!-- /.container -->
  </div>
  <!-- /.navbar-inner -->
</div>
<!-- /.navbar -->

und meine lösung funktioniert oder nicht?
WooCaSh

@WooCaSh funktionierte eher die Reihenfolge ihrer Lösung custom.js war falsch, ich bemerkte $ ('nav a'). Ein ('click', function () {und in meinem Fall ist es eine Klasse, dann $ ('. Nav a'). On ('click', function () {. Danke, du hast mir sehr geholfen!
Tim Vitor

Mögliches Duplikat von Close responsive navbar automatisch
chrylis

Wenn Sie nicht versuchen möchten, alle diese Lösungen hier selbst zu vergleichen, sollten Sie die Nummer 1 dieser Antwort bearbeiten .
Caw

Sie können meine Antwort hier sehen stackoverflow.com/questions/14248194/…
Camel

Antworten:


165

Versuche dies:

$('.nav a').on('click', function(){
    $('.btn-navbar').click(); //bootstrap 2.x
    $('.navbar-toggle').click(); //bootstrap 3.x by Richard
    $('.navbar-toggler').click(); //bootstrap 4.x
});

1
Das hat super geklappt. Danke WooCaSh. Ich habe auch nur vorgeschlagen, ein "." zum Code vor $ ('nav a') => $ ('. nav a'). [Klassenauswahl fehlte ein Punkt "."]
Clain Dsilva

7
Zu Ihrer Information, das funktioniert nicht in allen Fällen. Wenn die Größe des Fensters geändert wird und das mobile Menü angezeigt wird, ist es standardmäßig geöffnet.
Andrew Boes

8
UPDATE: Die übliche Auswahl für Bootstrap 3 ist .navbar-toggle, also $ (". Navbar-toggle"). Click ();
Richard

41
Dies führt zu Problemen in der Navigationsleiste. Verwenden Sie besser $ ('. Nav -apse'). Collapse ('hide'); beim Klicken auf ein Ereignis, anstatt die Umschalttaste anzuklicken.
Rohan

7
Wenn die Navigationsleiste im "Desktop" -Modus geöffnet ist, flackert oder schließt sie und öffnet sich dann wieder, wenn Sie diese verwenden.
mlapaglia

134

Ich repliziere einfach die 2 Attribute von btn-navbar( data-toggle="collapse" data-target=".nav-collapse.in") auf jedem Link wie folgt:

<div class="nav-collapse">
  <ul class="nav" >
    <li class="active"><a href="#home" data-toggle="collapse" data-target=".nav-collapse.in">Home</a></li>
    <li><a href="#about" data-toggle="collapse" data-target=".nav-collapse.in">About</a></li>
    <li><a href="#portfolio" data-toggle="collapse" data-target=".nav-collapse.in">Portfolio</a></li>
    <li><a href="#services" data-toggle="collapse" data-target=".nav-collapse.in">Services</a></li>
    <li><a href="#contact" data-toggle="collapse" data-target=".nav-collapse.in">Contact</a></li>
  </ul>
</div>

In der Bootstrap 4-Navigationsleiste wurde die Syntax wie folgtin geändert show:

data-toggle="collapse" data-target=".navbar-collapse.show"


13
Hinzufügen data-toggleund data-targetzu <li> ist eine sauberere Lösung. Vielen Dank.
Trante

9
Funktioniert gut auf Mobilgeräten, führt jedoch dazu, dass die Animation der Navigationsleiste auf dem Desktop zusammenbricht, was unerwünscht ist.
James Brewer

34
@ JamesBrewer Um die Kollapsanimation auf der Desktop-Version zu vermeiden, fügen Sie .indem data-toggle="collapse" data-target=".nav-collapse.in"
Datenziel Folgendes hinzu

23
Vergessen Sie nicht, .nav-Zusammenbruch durch .navbar-Zusammenbruch für Bootstrap 3 zu ersetzen
kuceram

3
Dies sollte die akzeptierte Antwort sein! Vielen Dank für die Veröffentlichung!
Trixtur

60
$(function() {
    $('.nav a').on('click', function(){ 
        if($('.navbar-toggle').css('display') !='none'){
            $('.navbar-toggle').trigger( "click" );
        }
    });
});

6
Dies ist eine bessere Lösung, da es einen Fehler verhindert, wenn Links sichtbar sind.
Bruno Dias

Auf Bootstrap 4 ist es .navbar-toggler. Wie auch immer, super funktionierender Code, danke!
Xdg

45

Verwenden Sie besser die Standardmethoden für Collapse.js ( V3-Dokumente , V4-Dokumente ):

$('.nav a').click(function(){
    $('.nav-collapse').collapse('hide');
});

4
Auf jeden Fall besser als mit den Klickfunktionen! Es ist am besten, das Risiko auf ein Minimum zu beschränken, indem Sie nur mit den Dingen interagieren, die Sie ändern möchten. Ein Klickereignis kann dazu führen, dass zusätzliche unerwünschte Funktionen ausgeführt werden. Ich wusste nichts über diese Kollapsmethode, danke.
Andrew

1
Dies ist die beste Lösung, die ich bisher gefunden habe. Danke dir. Nur eine kleine Verbesserung, die ich gemacht habe: Ersetzen Sie den .nav aSelektor durch diesen:.nav a:not(.dropdown-toggle)
Mneute

Für mich, auf meiner Bootstrap 4 Beispielseite, anstatt .nav aich verwenden musste.navbar a
alexandre1985

Meinst du .navbar-collapsenicht und nicht .nav-collapse?
Volomike

Nein, ich nicht, weil .nav-collapseim Fragecodebeispiel verwendet wurde.
Vadim P.

32

Noch eleganter ohne ein bisschen doppelten Code ist es, die Attribute data-toggle="collapse"und einfach data-target=".nav-collapse"auf das Navi selbst anzuwenden :

<nav class="nav-collapse" data-toggle="collapse" data-target=".nav-collapse">
  <ul class="nav">
    <li class="active"><a href="#home">Home</a></li>
    <li><a href="#about">About</a></li>
    <li><a href="#portfolio">Portfolio</a></li>
    <li><a href="#services">Services</a></li>
    <li><a href="#contact">Contact</a></li>
  </ul>
</nav>

Super sauber, kein JavaScript erforderlich. Funktioniert hervorragend, solange Ihre nav aElemente genügend Polsterung für dicke Finger haben und Sie nicht verhindern, dass Klickereignisse über das e.stopPropagation()Klicken von nav aElementen sprudeln .


1
Dies ist der richtige Bootstrap-Weg, um dieses Verhalten zu erreichen.
ApenasVB

2
Ich würde vorschlagen, das Ziel so zu ändern, dass es auch das In- Class- Ziel enthält . Dadurch wird verhindert, dass sich die Desktop-Versionen merkwürdig verhalten. data-target=".nav-collapse.in"
Dave

Das Schöne daran ist, dass es mit dem RouterLink von Angular 4 funktioniert, während die anderen Lösungen dies nicht tun!
stt106

1
In Bootstrap 4 wäre es<div class="collapse navbar-collapse" data-toggle="collapse" data-target=".navbar-collapse">
JoshJoe

17

Aktualisieren Sie Ihre

<li>
  <a href="#about">About</a>
</li>

zu

<li>
  <a data-toggle="collapse" data-target=".nav-collapse" href="#about">About</a>
</li>

Diese einfache Änderung hat bei mir funktioniert.

Ref: https://github.com/twbs/bootstrap/issues/9013


1
Dies sollte die akzeptierte Antwort sein. Funktioniert perfekt mit Standard-Bootstrap-Konventionen.
Bradley

1
Einverstanden. Dies ist der richtige Weg, um dies zu erreichen. Keine Notwendigkeit für jQuery. Ich verstehe nicht, warum dies so wenig Aufsehen erregt hat.
Wahwahwah

Auf einer "Standard" -Visual Studio-Masterseite wird das Burger-Menü ausgeblendet und es werden keine Menüoptionen angezeigt. Diese Antwort funktioniert nur mit einem bestimmten Menükonfigurationslayout (das Sie nicht als Beispiel angeben).
Gone Coding

1
Das würde nicht mehr funktionieren. Verwendung data-target=".navbar-collapse.in"wie beim neuen Bootstrap-Standard. Die .inKlasse soll die Animation auf dem Desktop verhindern
Philip Oghenerobo Balogun 14.

Ich habe diese Lösung in meiner Situation verwendet, aber die ID meines div.navbar-collapseElements als data-targetParameter verwendet.
Maxathousand

13

Die Navigation sollte jedes Mal geschlossen werden, wenn ein Benutzer irgendwo auf den Körper klickt - nicht nur auf Navigationselemente. Angenommen, das Menü ist geöffnet, aber der Benutzer klickt auf den Seitenkörper. Der Benutzer erwartet, dass das Menü geschlossen wird.

Sie müssen auch sicherstellen, dass die Umschalttaste sichtbar ist, da sonst ein Sprung im Menü angezeigt wird.

$(document).ready(function() { 

$("body").click(function(event) {
        // only do this if navigation is visible, otherwise you see jump in navigation while collapse() is called 
         if ($(".navbar-collapse").is(":visible") && $(".navbar-toggle").is(":visible") ) {
            $('.navbar-collapse').collapse('toggle');
        }
  });

});

"Elemente gelten als sichtbar, wenn sie Speicherplatz im Dokument belegen." Ihr Code sollte den Zusammenbruch verhindern, wenn der Zusammenbruch der Navigationsleiste auf dem Bildschirm nicht sichtbar ist, dies jedoch nicht.
Steve M

Nicht nur, dass es großartig funktioniert, es ist auch die einzige Lösung, die für mich funktioniert hat, Bootstrap> 3.
AME

13

Getestet auf Bootstrap 3.3.6 - funktioniert!

$('.nav a').click(function () {
    $('.navbar-collapse').collapse('hide');
});


7

Versuchen Sie dies> Bootstrap 3

Genial genau das, wonach ich gesucht habe, aber ich hatte einige Konflikte mit dem Javascript und dem Bootstrap-Modal, dies hat es behoben.

    $(function() {
    $('.navbar-nav').on('click', function(){ 
        if($('.navbar-header .navbar-toggle').css('display') !='none'){
            $(".navbar-header .navbar-toggle").trigger( "click" );
        }
    });
});

Hoffe das hilft.


6

Das hat bei mir gut funktioniert. Dies entspricht der akzeptierten Antwort, behebt jedoch das Problem in Bezug auf die Desktop- / Tablet-Ansicht

$('.navbar-nav a').on('click', function () {
        if (window.innerWidth <= 768) {
            $(".navbar-toggle").click();
        }
    });


window.innerWidth <= 767 ist besser;) oder window.innerWidth <768
Alex Tape

Dies sollte als Top-Antwort ausgewählt werden. Dies funktioniert jedoch nicht mit Dropdowns. Ich habe es behoben, indem ich den Selektor durch ersetzt habe: $ ('. Navbar-nav'). Find ('a: not (". Dropdown-toggle")')
Erikas

6

$('.nav a').click(function () {
    $('.navbar-collapse').collapse('hide');
});


Das funktioniert bei mir. Ich habe in jeder Kendo-Ansicht eine Navigationsleiste, daher muss ich sie bei der beforeShowVeranstaltung schließen.
Xinthose

4

Ich denke, es ist besser, die Collapse.js- Standardmethoden von Bootstrap 3 zu verwenden, indem Sie das .navbar-collapseals reduzierbares Element verwenden, das Sie wie unten gezeigt ausblenden möchten.

Andere Lösungen können andere unerwünschte Probleme mit der Anzeige oder Funktion von Elementen auf Ihrer Webseite verursachen. Obwohl einige Lösungen Ihr anfängliches Problem zu beheben scheinen, können andere sehr gut eingeführt werden. Stellen Sie daher sicher, dass Sie Ihre Site nach jeder Korrektur gründlich testen.

So sehen Sie diesen Code in Aktion:

  1. Klicken Sie unten auf "Run This Code Snippet".
  2. Drücken Sie die Taste "Ganzseite".
  3. Fenster skalieren, bis das Dropdown-Menü aktiviert wird.
  4. Dann wählen Sie eine Menüoption und voila!

Prost!


Dies ist viel besser als die derzeit akzeptierte Antwort. Mit diesem bekomme ich Geisteranimationen auf dem Desktop.
Cody

3

Geben Sie auf jedem Dropdown-Link data-toggle = "Collapse" und data-target = ". Nav-Collapse" ein, wobei Nav-Collapse der Name ist, den Sie der Dropdown-Liste geben.

<ul class="nav" >
      <li class="active"><a href="#home">Home</a></li>
      <li><a href="#about" data-toggle="collapse" data-target=".nav-collapse">About</a></li>
      <li><a href="#portfolio" data-toggle="collapse" data-target=".nav-collapse">Portfolio</a></li>
      <li><a href="#services" data-toggle="collapse" data-target="nav-collapse">Services</a></li>
      <li><a href="#contact" data-toggle="collapse" data-target=".nav-collapse">Contact</a></li>
      <!-- dropdown -->
  </ul>

Dies funktioniert perfekt auf Bildschirmen, die ein Dropdown-Menü wie mobile Bildschirme haben, aber auf Desktop und Tablet wird ein Flickr erstellt. Dies liegt daran, dass die Klasse .collapsing angewendet wird. Um das flickr zu entfernen, habe ich eine Medienabfrage erstellt und einen Überlauf eingefügt, der für die reduzierende Klasse verborgen ist.

@media (min-width: 768px) {
.collapsing {
    overflow: inherit;
  }
}

3

Das Hinzufügen von data-toggle = "apse "data-target =". Navbar-collapse.in "zu dem Tag <a>hat bei mir funktioniert.

<div>

        <button type="button" class="navbar-toggle"  data-toggle="collapse" data-target=".navbar-collapse">
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
    </div>
            <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav navbar-right">
                <li class="nav-item"><a
                    href="#" data-toggle="collapse" data-target=".navbar-collapse.in" class="nav-link" >Home
                </a></li>
            </ul>
    </div>

2

So habe ich es gemacht. Wenn es einen reibungsloseren Weg gibt, sagen Sie es mir bitte.

In den <a>Tags, in denen sich die Links für das Menü befinden, habe ich diesen Code hinzugefügt:

onclick="$('.navbar-toggle').click()"

Die Folienanimation bleibt erhalten. Bei voller Nutzung würde es also so aussehen:

<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation" ng-controller="topNavController as topNav">
<div class="container">
    <div class="navbar-header">
        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
        </button>
        <a class="navbar-brand" href="home.html">My Cool Site</a>
    </div>
    <div id="navbar" class="navbar-collapse collapse">
        <ul class="nav navbar-nav">
            <li class="active" onclick="$('.navbar-toggle').click()"><a href="home.html" onclick="$('.navbar-toggle').click()"><i class="fa fa-home"></i> Home</a></li>
            <li><a href="aboutus.html" onclick="$('.navbar-toggle').click()">About Us</a></li>
        </ul>
    </div><!--/.nav-collapse -->
</div>


1
$(function() {
    $('.nav a').on('click touchstart', function(){ 
        if($('.navbar-toggle').css('display') !='none'){
            $(".navbar-toggle").trigger( "click" );
        }
    });
});

// HINWEIS Ich habe den "Touchstart" für Mobile Touch hinzugefügt. Touchstart / End hat keine Verzögerung


1

Dies ist die beste Lösung, die ich verwendet habe.

$(document).ready(function () {

        $('.nav a').on('click', function () {

            if ($(".btn-navbar").is(":visible") ){ $(".btn-navbar").trigger("click"); } //bootstrap 2.x
            if ($(".navbar-toggle").is(":visible")) { $(".navbar-toggle").trigger("click"); } //bootstrap 3.x
        });

    });

1

Für diejenigen, die bemerkt haben, dass Desktop-Navigationsleisten bei Verwendung dieser Lösung flackern:

$('.nav a').on('click', function(){
    $(".navbar-collapse").collapse('hide');
}); 

Eine einfache Lösung für dieses Problem besteht darin, auf die ausgeblendete Navigationsleiste nur zu verweisen, indem überprüft wird, ob 'in' vorhanden ist:

$('.navbar-collapse .nav a').on('click', function(){
    if($('.navbar-collapse').hasClass('in'))
    {
        $(".navbar-collapse").collapse('hide');
    }
});

Dadurch wird die Navigationsleiste beim Klicken reduziert, wenn sich die Navigationsleiste im mobilen Modus befindet, die Desktop-Version bleibt jedoch in Ruhe. Dies vermeidet das Flackern, das viele Menschen auf Desktop-Versionen gesehen haben.

Wenn Sie eine Navigationsleiste mit Dropdown-Menüs haben, können Sie diese nicht sehen, da die Navigationsleiste ausgeblendet wird, sobald Sie darauf klicken. Wenn Sie also Dropdown-Menüs haben (wie ich!), Verwenden Sie Folgendes:

$('.nav a').on('click', function(e){
    if(!$(this).closest('li').hasClass('dropdown') & $( '.navbar-collapse').hasClass('in'))
    {
        $(".navbar-collapse").collapse('hide');
    }
});

Hierbei wird nach dem Vorhandensein der Dropdown-Klasse über dem im DOM angeklickten Link gesucht. Wenn dieser vorhanden ist, wollte der Link ein Dropdown-Menü starten, sodass das Menü nicht ausgeblendet wird. Wenn Sie im Dropdown-Menü auf einen Link klicken, wird die Navigationsleiste korrekt ausgeblendet.


1
$("body,.nav a").click(function (event) {

    // only do this if navigation is visible, otherwise you see jump in
    //navigation while collapse() iS called 
    if ($(".navbar-collapse").is(":visible") && $(".navbar-toggle").is(":visible")) {
    $('.navbar-collapse').collapse('toggle');
  }
});

1

100% arbeiten: -

In HTML hinzufügen

<div id="myMenu" class="nav-collapse">

Javascript

 $(function(){ 
 var navMain = $("#myMenu");
 navMain.on("click", "a", null, function () {
     navMain.collapse('hide');
 });
});

0

Dies verbirgt den Zusammenbruch der Navigation, anstatt ihn zu animieren, aber das gleiche Konzept wie oben

JS:

$('.nav a').on('click', function () {
    $("#funk").toggleClass('in collapse');
});

HTML:

<div class="navbar-collapse" id="funk">

Ich bevorzuge dies auf Websites mit nur einer Seite, da ich localScroll.js verwende, das bereits animiert ist.


0

Mobile Ansicht: Ausblenden der Umschaltnavigation in Bootstrap + Dropdown + JQuery + Scrollto mit Navigationselementen, die auf Anker / IDs auf derselben Seite verweisen , eine Seitenvorlage

Das Problem, mit dem ich mit einer der oben genannten Lösungen experimentiert habe, war, dass nur die Untermenüelemente reduziert werden, während das Navigationsmenü nicht reduziert wird.

Also habe ich meine Gedanken gemacht ... und was können wir beobachten? Nun, jedes Mal, wenn wir / die Benutzer auf einen Scrollto-Link klicken, soll die Seite zu dieser Position scrollen und gleichzeitig das Menü reduzieren, um die Seitenansicht wiederherzustellen.

Nun ... warum diesen Job nicht den Scrollto-Funktionen zuweisen? Einfach :-)

Also in den beiden Codes

// scroll to top action
$('.scroll-top').on('click', function(event) {
    event.preventDefault();
    $('html, body').animate({scrollTop:0}, 'slow');

und

// scroll function
function scrollToID(id, speed){
var offSet = 67;
var targetOffset = $(id).offset().top - offSet;
var mainNav = $('#main-nav');
    $('html,body').animate({scrollTop:targetOffset}, speed);
if (mainNav.hasClass("open")) {
    mainNav.css("height", "1px").removeClass("in").addClass("collapse");
    mainNav.removeClass("open");
}

Ich habe gerade den gleichen Befehl in beiden Funktionen hinzugefügt

    if($('.navbar-toggle').css('display') !='none'){
    $(".navbar-toggle").trigger( "click" );
}

(ein großes Lob an einen der oben genannten Mitwirkenden)

so (das gleiche sollte zu beiden Schriftrollen hinzugefügt werden)

$('.scroll-top').on('click', function(event) {
    event.preventDefault();
    $('html, body').animate({scrollTop:0}, 'slow');
if($('.navbar-toggle').css('display') !='none'){
    $(".navbar-toggle").trigger( "click" );
}
});

Wenn du es in Aktion sehen willst, schau es dir einfach bei recupero dati da NAS an


0

Bootstrap3-Benutzer versuchen den unten angegebenen Code. Es hat bei mir funktioniert.

function close_toggle() {
   if ($(window).width() <= 768) {
      $('.nav a').on('click', function(){
          $(".navbar-toggle").click();
      });
   }
   else {
     $('.nav a').off('click');
   }
}
close_toggle();

$(window).resize(close_toggle);

0

Bootstrap legt eine .inKlasse für das Collapse-Element fest, um die Animation auszulösen und zu öffnen. Wenn Sie die .inKlasse einfach entfernen , wird die Animation nicht ausgeführt, sondern das Element wird ausgeblendet - nicht genau das, was Sie möchten.

Es ist wahrscheinlich schneller, eine ifAnweisung auszuführen , um zu überprüfen, ob die Standard-Bootstrap-Klasse .infür das Element festgelegt wurde.

Dieser Code sagt also nur:

wenn mein Element die Klasse hat .in angewendet wurde, schließen Sie sie, indem Sie die Standard-Bootstrap-Animation auslösen. Andernfalls führen Sie die Standard-Bootstrap-Aktion / -Animation zum Öffnen aus

$('#navbar a').on('click touchstart', function() {
    // if .in class is set on element, the element is visible – you want to hide it
    if ($('#navbar').hasClass('in')) {
        // collapse toggle will remove the .in class and animate the element closed 
        $('#navbar').collapse('toggle');
    }
})

0

Fügen Sie dann jedem eine ID hinzu

<li> add data-target="myMenu" data-toggle="collapse"
<div id="myMenu" class="nav-collapse">
    <ul class="nav">
      <li class="active" data-target="myMenu" data-toggle="collapse"><a href="#home">Home</a></li>
      <li data-target="myMenu" data-toggle="collapse"><a href="#about">About</a></li>
      <li data-target="myMenu" data-toggle="collapse"><a href="#portfolio">Portfolio</a></li>
      <li data-target="myMenu" data-toggle="collapse"><a href="#services">Services</a></li>
      <li data-target="myMenu" data-toggle="collapse"><a href="#contact">Contact</a></li>
    </ul>
</div>

0

Eine weitere schnelle Lösung für Bootstrap 3. * könnte sein:

$( document ).ready(function() {
    //
    // Hide collapsed menu on click
    //
    $('.nav a').each(function (idx, obj) {
        var selected = $(obj);

        selected.on('click', function() {
            if (selected.closest('.collapse.in').length > 0) {
                $('.navbar-toggle').click(); //bootstrap 3.x by Richard
            }
        });
    });
});

0

Ich habe hier eine Lösung veröffentlicht, die mit Aurelia funktioniert: https://stackoverflow.com/a/41465905/6466378

Das Problem ist , man kann nicht einfach addieren data-toggle="collapse"und data-target="#navbar"zu Ihrem einem Elemente. Und jQuery funktioniert nicht, wenn es sich um eine Aurelia- oder Angular-Umgebung handelt.

Die beste Lösung für mich war, ein benutzerdefiniertes Attribut zu erstellen, das die entsprechende Medienabfrage abhört und das data-toggle="collapse"Attribut bei Bedarf hinzufügt :

<a href="#" ... collapse-toggle-if-less768 data-target="#navbar"> ...

Das benutzerdefinierte Attribut mit Aurelia sieht folgendermaßen aus:

import {autoinject} from 'aurelia-framework';

@autoinject
export class CollapseToggleIfLess768CustomAttribute {
  element: Element;

  constructor(element: Element) {
    this.element = element;
    var mql = window.matchMedia("(min-width: 768px)");
    mql.addListener((mediaQueryList: MediaQueryList) => this.handleMediaChange(mediaQueryList));
    this.handleMediaChange(mql);
  }

  handleMediaChange(mediaQueryList: MediaQueryList) {
    if (mediaQueryList.matches) {
      var dataToggle = this.element.attributes.getNamedItem("data-toggle");
      if (dataToggle) {
        this.element.attributes.removeNamedItem("data-toggle");
      }
    } else {
      var dataToggle = this.element.attributes.getNamedItem("data-toggle");
      if (!dataToggle) {
        var dataToggle = document.createAttribute("data-toggle");
        dataToggle.value = "collapse";
        this.element.attributes.setNamedItem(dataToggle);
      }
    }
  }
}


0

Ich bin auf Bootstrap 4, verwende fullPage.js mit einem festen Navigationssystem und habe alles hier Aufgetestete mit gemischten Ergebnissen ausprobiert.

  • Versuchte den besten, sauberen Weg:

    data-toggle="collapse" data-target=".navbar-collapse.show"

    Das Menü würde zusammenbrechen, aber die href-Links würden nirgendwohin führen.

  • Versuchte die logischen anderen Wege:

    $('myClickableElements').on('click touchstart', function(){
      $(".navbar-collapse.show").collapse('hide');
      // or
      $(".navbar-collapse.show").collapse('toggle');
      // or
      $('.navbar-toggler').click()
    });

    Aufgrund des Touchstart-Ereignisses würde es ein seltsames Verhalten geben: Die angeklickten Schaltflächen würden nicht die sein, auf die ich tatsächlich geklickt habe, wodurch die Links unterbrochen würden. Außerdem würde es die .show-Klasse zu einigen anderen nicht verwandten Dropdowns in meinem Navi hinzufügen, was noch mehr seltsame Dinge verursachen würde.

  • Versucht, div in li zu ändern
  • Versucht, e.preventDefault () und e.stopPropagation ()
  • Versuchte und versuchte mehr

Nichts würde funktionieren.

Stattdessen hatte ich die (bisher) wunderbare Idee, dies zu tun:

$(window).on('hashchange',function(){
   $(".navbar-collapse.show").collapse('hide');
});

Ich hatte bereits Sachen in dieser Hashchange-Funktion, si ich musste nur diese Zeile hinzufügen.

Es macht genau das, was ich will: das Menü reduzieren, wenn sich der Hash ändert (dh ein Klick, der an eine andere Stelle führt, ist aufgetreten). Was gut ist, denn ich kann jetzt Links in meinem Menü haben, die es nicht reduzieren.

Wer weiß, vielleicht hilft das jemandem in meiner Situation!

Und danke an alle, die an diesem Thread teilgenommen haben, viele Informationen, die hier gelernt werden können.


0

In den meisten Fällen möchten Sie die Umschaltfunktion nur aufrufen, wenn die Umschalttaste sichtbar ist ...

if ($('.navbar-toggler').is(":visible")) $('.navbar-toggler').click();

-1

Das eingecheckte Menü wird geöffnet, indem die Klasse 'in' eingecheckt und dann der Code ausgeführt wird.

$('.navbar-collapse a').on('click', function(){
    if ( $( '.navbar-collapse' ).hasClass('in') ) {
        $('.navbar-toggle').click();
    }
});

funktioniert perfekt.

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.