Navbar要素の外側をクリックして開いた折りたたみnavbarを閉じるにはどうすればよいですか?現在、それを開くまたは閉じる唯一の方法は、navbar-toggle
ボタン。
例とコードについては here をご覧ください:
これまでのところ、私は次のことを試しましたが、うまくいかないようです:
jQuery(document).click(function() {
});
jQuery('.navbar').click(function(event) {
jQuery(".navbar-collapse").collapse('hide');
event.stopPropagation();
});
それを見てください:
_$(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')
は私にとってもうまくいきませんでした。アニメーションは、クラスの追加や削除よりも少しいいと思います。
受け入れられた答えは正しく機能していないようです。 「navbar-collapse」に「in」クラスがあるかどうかを確認するだけです。 navbarへの参照を使用して、期待どおりにcollapseメソッドを起動できます。
$(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');
}
});
これを使用すると、私にとってはうまくいきます。
$(function() {
$(document).click(function (event) {
$('.navbar-collapse').collapse('hide');
});
});
私が使用することにした解決策は、ここで受け入れられた答えと この答え
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
をクリックしても、メニューを閉じることができます。
stopPropagation()
は常に最良のソリューションではありません。むしろ次のようなものを使用します。
_jQuery(document.body).on('click', function(ev){
if(jQuery(ev.target).closest('.navbar-collapse').length) return; // Not return false
// Hide navbar
});
_
_.navbar
_の他のイベントをリッスンしたくないと想定するのは危険だと思います。 stopPropagation()
を使用する場合、これは不可能です。
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()に配置されます。
ドキュメントが読み込まれると、このコードはクリックイベントを待ちます。モバイルメニュードロップダウンが開いている(つまり、navbarの折りたたみ可能な部分に「show」クラスがある)場合、クリックされたオブジェクト(ターゲット)がモバイルメニューボタンではない(つまり、「navbar-toggler」クラスを持っていない)モバイルメニューボタンがクリックされたことを伝え、メニューが閉じます。
非リンクがあり、ユーザーがこれらのアイテムを誤ってクリックした場合にパネルを閉じたくないというシナリオがありました。ここの他の回答willは、リンクではないアイテムのテキストをクリックしてもパネルを閉じます。
これを修正するために、私はPaul Tarrの答えに追加しました。チェックを入れて解決策をラップし、クリックが
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 では、パネル内の非リンクをクリックしても折りたたまれないことがわかります。
@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();
}
});
});
$(document).click(function (event) {
if ($('.navbar-collapse').attr('aria-expanded') == "true") {
$('.navbar-collapse:visible').click();
}
});
Bootstrap 4:
$(document).click(function(event) {
$(event.target).closest(".navbar").length || $(".navbar-collapse.show").length && $(".navbar-collapse.show").collapse("hide")
});
ブートストラップ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でテキストをクリックしても、クリックイベントやmouseupイベントは登録されません。ただし、画像をクリックするとイベントが発生します。
$(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");
});