Jqueryを使用して簡単なドロップダウンメニューを開発しています。ユーザーがトリガー領域を押すと、ドロップダウン領域が切り替わります。私の質問は、ドロップダウンメニューを閉じるためにドロップダウンメニューの外にクリックイベントをどのように持つのですか?
ドロップダウンを非表示にするためにDOMの最上部までバブルするクリック、およびバブルダウンを停止するためにドロップダウンの親に到達するクリックを伝えることができます。
/* Anything that gets to the document
will hide the dropdown */
$(document).click(function(){
$("#dropdown").hide();
});
/* Clicks within the dropdown won't make
it past the dropdown itself */
$("#dropdown").click(function(e){
e.stopPropagation();
});
ドロップダウンメニューを閉じるためにドロップダウンメニューの外にクリックイベントを作成する方法は?コードはこちら
$(document).click(function (e) {
e.stopPropagation();
var container = $(".dropDown");
//check if the clicked area is dropDown or not
if (container.has(e.target).length === 0) {
$('.subMenu').hide();
}
})
クリックイベントを何らかの要素に添付する必要があります。ページに他の要素がたくさんある場合は、それらすべてにクリックイベントを添付したくないでしょう。
考えられる1つの方法は、ドロップダウンメニューの下で、ページ上の他のすべての要素の上に透明なdivを作成することです。ドロップダウンが表示されたときに表示します。要素に、ドロップダウンと透明なdivを隠すクリックハンドラーを用意します。
$('#clickCatcher').click(function () {
$('#dropContainer').hide();
$(this).hide();
});
#dropContainer { z-index: 101; ... }
#clickCatcher { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 100; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="dropDown"></div>
<div id="clickCatcher"></div>
特定の要素でイベントの伝播を停止すると、他のスクリプトの実行が妨げられる可能性があるため、危険になる場合があります。そのため、トリガーが関数内から除外された領域からのものかどうかを確認してください。
$(document).on('click', function(event) {
if (!$(event.target).closest('#menucontainer').length) {
// Hide the menus.
}
});
ここでは、ドキュメントをクリックすると機能が開始されますが、#menucontainerからのトリガーは除外されます。詳細については、 https://css-tricks.com/dangers-stopping-event-propagation/
選択した回答は、1つのドロップダウンメニューでのみ機能します。複数のソリューションの場合:
$('body').click(function(event){
$dropdowns.not($dropdowns.has(event.target)).hide();
});
動作する別の複数のドロップダウンの例 https://jsfiddle.net/vgjddv6u/
$('.moderate .button').on('click', (event) => {
$(event.target).siblings('.dropdown')
.toggleClass('is-open');
});
$(document).click(function(e) {
$('.moderate')
.not($('.moderate').has($(e.target)))
.children('.dropdown')
.removeClass('is-open');
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.4.0/css/bulma.css" rel="stylesheet" />
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<style>
.dropdown {
box-shadow: 0 0 2px #777;
display: none;
left: 0;
position: absolute;
padding: 2px;
z-index: 10;
}
.dropdown a {
font-size: 12px;
padding: 4px;
}
.dropdown.is-open {
display: block;
}
</style>
<div class="control moderate">
<button class="button is-small" type="button">
moderate
</button>
<div class="box dropdown">
<ul>
<li><a class="nav-item">edit</a></li>
<li><a class="nav-item">delete</a></li>
<li><a class="nav-item">block user</a> </li>
</ul>
</div>
</div>
<div class="control moderate">
<button class="button is-small" type="button">
moderate
</button>
<div class="box dropdown">
<ul>
<li><a class="nav-item">edit</a></li>
<li><a class="nav-item">delete</a></li>
<li><a class="nav-item">block user</a></li>
</ul>
</div>
</div>