Comment fermer une barre de navigation ouverte réduite lorsque vous cliquez en dehors de l'élément navbar dans Bootstrap 3?

Comment puis-je fermer une barre de navigation ouverte réduite en cliquant en dehors de l'élément de la barre de navigation? Actuellement, la seule façon de l'ouvrir ou de le fermer est de cliquer sur le bouton navbar-toggle.

Voir ici pour un exemple et le code:

Jusqu'à présent, j'ai essayé ce qui suit, qui ne semble pas fonctionner:

jQuery(document).click(function() {

});

jQuery('.navbar').click(function(event) {
    jQuery(".navbar-collapse").collapse('hide');
    event.stopPropagation();
});
30
demandé sur Jordan.J.D 2014-05-20 20:04:09

9 réponses

Jetez un oeil qui:

$(document).ready(function () {
    $(document).click(function (event) {
        var clickover = $(event.target);
        var _opened = $(".navbar-collapse").hasClass("navbar-collapse in");
        if (_opened === true && !clickover.hasClass("navbar-toggle")) {
            $("button.navbar-toggle").click();
        }
    });
});

Votre violon fonctionne avec ça: http://jsfiddle.net/52VtD/5718/

C'est une version modifiée de cette réponse, qui manque d'animation et est aussi un peu plus compliquée.

Je sais, invoquer le click() n'est pas très élégant, mais collapse('hide') n'a pas fonctionné pour moi non plus, et je pense que l'animation est un peu plus agréable que d'ajouter et de supprimer les classes à peine.

38
répondu nozzleman 2017-05-23 12:34:29

La réponse acceptée ne semble pas fonctionner correctement. Il suffit de vérifier si "navbar-collapse" a la classe "in". Nous pouvons alors déclencher la méthode d'effondrement comme prévu en utilisant notre référence à la barre de navigation.

$(document).click(function (event) {
    var clickover = $(event.target);
    var $navbar = $(".navbar-collapse");               
    var _opened = $navbar.hasClass("in");
    if (_opened === true && !clickover.hasClass("navbar-toggle")) {      
        $navbar.collapse('hide');
    }
});
35
répondu Paul Tarr 2014-08-20 15:43:28

La solution que j'ai décidé d'utiliser a été tirée de la réponse acceptée ici et de cette réponse

jQuery('body').bind('click', function(e) {
    if(jQuery(e.target).closest('.navbar').length == 0) {
        // click happened outside of .navbar, so hide
        var opened = jQuery('.navbar-collapse').hasClass('collapse in');
        if ( opened === true ) {
            jQuery('.navbar-collapse').collapse('hide');
        }
    }
});

Cela masque un menu de navigation réduit ouvert si l'utilisateur clique n'importe où en dehors de l'élément .navbar. Bien sûr, cliquer sur .navbar-toggle fonctionne toujours pour fermer le menu aussi.

13
répondu henrywright 2017-05-23 12:26:09

L'utilisation de cela fonctionne pour moi.

$(function() {
  $(document).click(function (event) {
    $('.navbar-collapse').collapse('hide');
  });
});
10
répondu Shiva Charan 2017-05-04 16:00:54

stopPropagation() n'est pas toujours la meilleure solution. Utilisez plutôt quelque chose comme:

jQuery(document.body).on('click', function(ev){
    if(jQuery(ev.target).closest('.navbar-collapse').length) return; // Not return false

    // Hide navbar
});

Je pense qu'il est dangereux de supposer que vous ne voulez jamais écouter un autre événement de la .navbar. Ce qui est impossible si vous utilisez stopPropagation().

4
répondu pstenstrm 2014-05-20 17:04:57

J'ai ajouté une condition à la réponse de @nozzleman pour vérifier si le robinet ou le clic a été fait sur n'importe quel élément dans le menu, et si c'est le cas, ne pas le réduire.

$(document).ready(function () {
    $(document).click(function (event) {
        var clickover = $(event.target);
        var _opened = $(".navbar-collapse").hasClass("navbar-collapse in");
        if (_opened === true && !clickover.hasClass("navbar-toggle") && clickover.parents('.navbar-collapse').length == 0) {
            $("button.navbar-toggle").click();
        }
    });
});
1
répondu sonxurxo 2015-05-20 09:20:52

Pour Bootstrap 4

Bootstrap 4 n'a pas de in classe. C'est Coffeescript.

  $(document).click (e)->
    #console.log e.target
    unless $('#toggle-button').has(e.target).length || $('#toggle-menu').has(e.target).length
      $('#toggle-menu').collapse('hide')

Donc, fondamentalement, sauf si vous cliquez sur le bouton ou le menu, fermez le menu.

Remarque: étrange, sur iOS cliquer sur le texte n'enregistre pas un événement de clic, ni un événement mouseup. Cliquer sur une image déclenche cependant des événements.

0
répondu Chloe 2017-06-12 17:49:40

J'ai eu un scénario où j'avais des non-liens et je ne voulais pas que le panneau se ferme si un utilisateur clique sur ces éléments sur accident. Les autres réponses ici sera fermer le panneau, même si vous cliquez sur le texte d'un élément qui n'est pas un lien.

Pour résoudre ce problème, j'ai ajouté à la réponse de Paul Tarr en enveloppant la solution dans une vérification pour voir si le clic s'est produit n'importe où à l'intérieur du

if ($(event.target).parents(".navbar-collapse").length < 1) { }

Le code complet deviendrait:

$(document).click(function (event) {
if ($(event.target).parents(".navbar-collapse").length < 1) {
    var clickover = $(event.target);
    var $navbar = $(".navbar-collapse");               
    var _opened = $navbar.hasClass("in");
    if (_opened === true && !clickover.hasClass("navbar-toggle")) {      
        $navbar.collapse('hide');
    }
  }
});

De cette démo violon vous peut voir que si vous cliquez sur un non-lien à l'intérieur du panneau, il ne le réduira pas.

0
répondu maxshuty 2017-11-20 19:28:31

Pour Bootstrap 4:

$(document).click(function(event) {
  $(event.target).closest(".navbar").length || $(".navbar-collapse.show").length && $(".navbar-collapse.show").collapse("hide")
});
0
répondu Timur 2018-09-01 20:33:10