如何在单击导航栏元素外部时关闭打开的折叠导航栏?目前,打开或关闭它的唯一方法是点击navbar-toggle
按钮。
有关示例和代码,请参阅here:
到目前为止,我已尝试过以下似乎不起作用的内容:
jQuery(document).click(function() {
});
jQuery('.navbar').click(function(event) {
jQuery(".navbar-collapse").collapse('hide');
event.stopPropagation();
});
答案 0 :(得分:40)
看看:
$(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/
它是this answer的修改版本,缺少动画,也有点复杂。
我知道,调用click()
并不是很优雅,但collapse('hide')
对我来说也不起作用,我认为动画比添加和删除类几乎没有好处。 / p>
答案 1 :(得分:36)
接受的答案似乎无法正常运作。它只需要检查" 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');
}
});
答案 2 :(得分:14)
我决定使用的解决方案来自此处和this answer
中接受的答案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
仍可以关闭菜单。
答案 3 :(得分:13)
使用它对我有用。
$(function() {
$(document).click(function (event) {
$('.navbar-collapse').collapse('hide');
});
});
答案 4 :(得分:4)
stopPropagation()
并非始终是最佳解决方案。而是使用类似的东西:
jQuery(document.body).on('click', function(ev){
if(jQuery(ev.target).closest('.navbar-collapse').length) return; // Not return false
// Hide navbar
});
我认为你永远不想听.navbar
中的任何其他事件是危险的。如果您使用stopPropagation()
,这是不可能的。
答案 5 :(得分:1)
我已经为@ nozzleman的回答添加了一个条件,检查是否已对菜单中的任何元素进行了点击或点击,如果是这样的话,请不要将其折叠
$(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();
}
});
});
答案 6 :(得分:1)
我有一个场景,我有非链接,如果用户在事故中点击这些项目,我不希望关闭面板。即使您单击非链接项目的文本, 中的其他答案也将关闭。
为了解决这个问题,我在保罗塔尔的答案中添加了检查,将检查结果包装在检查中,以确定点击是否发生在
内的任何地方if ($(event.target).parents(".navbar-collapse").length < 1) { }
完整的代码将成为:
$(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');
}
}
});
在此demo fiddle中,您可以看到,如果您点击面板内部的非链接,则不会将其折叠。
答案 7 :(得分:0)
Bootstrap 4没有in
类。这是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')
基本上,除非您单击按钮或菜单,否则请关闭菜单。
注意:奇怪的是,在iOS上单击文本时不会注册click事件,也不会注册mouseup事件。点击图像会触发事件。
答案 8 :(得分:0)
对于Bootstrap 4:
$(document).click(function(event) {
$(event.target).closest(".navbar").length || $(".navbar-collapse.show").length && $(".navbar-collapse.show").collapse("hide")
});
答案 9 :(得分:0)
$(document).click(function (event) {
if ($('.navbar-collapse').attr('aria-expanded') == "true") {
$('.navbar-collapse:visible').click();
}
});
答案 10 :(得分:0)
$(window).click(function (e) {
if ($(e.target).closest('.codehim-dropdown').length) {
return;
}
if ($(e.target).closest(offCanvas).length) {
return;
}
//check if menu really opened
if ($(hamburger).hasClass("active")) {
closeMenu();
}
$(dimOverlay).fadeOut();
$(".menu-items").slideUp();
$(".dropdown-heading").removeClass("active");
});
答案 11 :(得分:0)
已转换的水头工对Bootstrap 4(.3.1)的回答:
I = rgb2gray(im2double(imread('I.jpg')));
G = imguidedfilter(I, 'DegreeOfSmoothing', 0.005);
J = imsharpen(G, 'Amount', 2);
figure;imshow(J)
B = imbilatfilt(I);
K = imsharpen(B, 'Amount', 2);
figure;imshow(K)
放置在ngOnInit()中。
在加载文档时,此代码等待单击事件。如果移动菜单下拉菜单处于打开状态(即导航栏的可折叠部分具有“显示”类),并且单击的对象(目标)不是移动菜单按钮(即不具有“ navbar-toggler”类),则我们告诉移动菜单按钮已被单击,然后菜单关闭。
答案 12 :(得分:0)
以下代码对我有用,优点是在小屏幕上,当您使用.navbar .navbar-expand类单击其nav父级时,它不会隐藏.collapse:
$(document).click(function (e) {
if($('.collapse').hasClass('show') && !$('nav').is(e.target) && $('nav').has(e.target).length === 0){
$('.navbar-toggler').click()
}
})
答案 13 :(得分:0)
我在这里回答一些问题时遇到了一些问题,我还希望能够按需关闭扩展菜单。所以我做了一个简单的函数,模拟点击。
function closeMenu(){
element = document.getElementById('nav_top');
if(element){
if(element.classList.contains('show')){
document.getElementById('navbar_toggler').dispatchEvent(new CustomEvent('click'));
}
}
}
$(document).ready(function () {
$(document).click(function (event) {
closeMenu();
});
});
使用此方法,您可以在外部点击时关闭它,也可以随时从任何其他函数调用 closeMenu()
。