在 Bootstrap 3 中单击导航栏元素外部时如何关闭打开的折叠导航栏?

IT技术 javascript jquery html css twitter-bootstrap-3
2021-01-31 15:28:48

如何在导航栏元素外部单击时关闭打开的折叠导航栏?目前,打开或关闭它的唯一方法是单击navbar-toggle按钮。

有关示例和代码,请参见此处

到目前为止,我已经尝试了以下似乎不起作用的方法:

jQuery(document).click(function() {

});

jQuery('.navbar').click(function(event) {
    jQuery(".navbar-collapse").collapse('hide');
    event.stopPropagation();
});
6个回答

看看那个:

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

你的小提琴作品:http : //jsfiddle.net/52VtD/5718/

它是这个答案的修改版本,它没有动画,也稍微复杂一点。

我知道,调用click()不是很优雅,但collapse('hide')对我也不起作用,而且我认为动画比几乎添加和删除类要好一些。

无论出于何种原因,我在最新的引导程序 3 上都需要这个: .hasClass("navbar-collapse collapse in")
2021-03-17 15:28:48
是的,我不确定为什么collapse('hide)不起作用。这个解决方案虽然完美。
2021-03-18 15:28:48
如果导航栏包含搜索框将不起作用,点击搜索文本输入不能关闭导航栏:jsfiddle.net/duongphuhiep/xtyb6wwu/1
2021-04-10 15:28:48
如果使用 Aurelia 你可以这样使用 this.eventAggregator.subscribe('router:navigation:success', response => { jQuery("navigation button.navbar-toggle").click(); });
2021-04-10 15:28:48
这在 angularJS 和 ui-router 中使用时非常有效。在 $stateChangeSuccess 上使用它非常好
2021-04-12 15:28:48

接受的答案似乎无法正常工作。它只需要检查“navbar-collapse”是否有“in”类。然后我们可以通过使用我们对导航栏的引用来按预期触发折叠方法。

$(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');
    }
});
是的,接受的答案对我也没有任何作用。这奏效了。
2021-03-15 15:28:48
我在哪里可以添加这个?
2021-03-26 15:28:48
谢谢!我找这个太久了。
2021-03-28 15:28:48
为我做了一个改变,效果很好。我会确保如果用户确实点击了打开的导航上的某个不是链接的地方,它会保持打开状态。
2021-03-30 15:28:48
如何将其与导航栏中的输入框结合使用?因为当我点击导航栏中的输入框时,导航栏也会消失。
2021-04-11 15:28:48

使用这个对我有用。

$(function() {
  $(document).click(function (event) {
    $('.navbar-collapse').collapse('hide');
  });
});
您缺少用于终止 click 方法的右括号。});
2021-03-22 15:28:48

我决定使用的解决方案取自这里接受的答案和这个答案

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

如果用户单击.navbar元素外的任何地方,这将隐藏打开的折叠导航菜单当然,点击.navbar-toggle仍然可以关闭菜单。

我会改变body,以html对账户高大设备或很少内容的网页。正文的高度与内容匹配,而不是可见的屏幕区域,因此如果您的页面内容很少,则不会触发内容区域下方的点击。否则,即使使用导航栏子菜单,也是一个很好的答案并且效果很好。
2021-03-30 15:28:48
我不得不从 hasClass 检查中删除“in”类,否则它无法正常工作。可能是因为我的 .navbar-collapse 元素中没有“in”类。我正在使用引导程序 4。
2021-04-02 15:28:48
作品精美。要关闭菜单本身和导航栏切换按钮以外的任何点击,只需将第一个“.navbar”替换为“.navbar-collapse”,这样即使您单击导航栏中的其他链接,它仍然会关闭菜单。
2021-04-07 15:28:48

为 Bootstrap 4(.3.1) 转换了喷枪工的答案:

$(document).ready(function () {
    $(document).click(
        function (event) {
            var target = $(event.target);
            var _mobileMenuOpen = $(".navbar-collapse").hasClass("show");
            if (_mobileMenuOpen === true && !target.hasClass("navbar-toggler")) {
                $("button.navbar-toggler").click();
            }
        }
    );
});

放置在 ngOnInit() 中。

加载文档时,此代码等待单击事件。如果移动菜单下拉菜单是打开的(即导航栏的可折叠部分具有“显示”类)并且单击的对象(目标)不是移动菜单按钮(即没有“导航栏-toggler”类),则我们告诉移动菜单按钮它已被点击,然后菜单关闭。

这对我有用。所有其他答案都来自几年前,可能不起作用。如果您按照指南使用 Bootstrap 4,这将起作用
2021-03-29 15:28:48