web-dev-qa-db-ja.com

jqueryドロップダウンメニューの外側をクリックして閉じる

Jqueryを使用して簡単なドロップダウンメニューを開発しています。ユーザーがトリガー領域を押すと、ドロップダウン領域が切り替わります。私の質問は、ドロップダウンメニューを閉じるためにドロップダウンメニューの外にクリックイベントをどのように持つのですか?

55
user670800

ドロップダウンを非表示にするために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();
});

デモ: http://jsbin.com/umubad/2/edit

111
Sampson

ドロップダウンメニューを閉じるためにドロップダウンメニューの外にクリックイベントを作成する方法は?コードはこちら

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

クリックイベントを何らかの要素に添付する必要があります。ページに他の要素がたくさんある場合は、それらすべてにクリックイベントを添付したくないでしょう。

考えられる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>
12
jacob.toye

特定の要素でイベントの伝播を停止すると、他のスクリプトの実行が妨げられる可能性があるため、危険になる場合があります。そのため、トリガーが関数内から除外された領域からのものかどうかを確認してください。

$(document).on('click', function(event) {
  if (!$(event.target).closest('#menucontainer').length) {
    // Hide the menus.
  }
});

ここでは、ドキュメントをクリックすると機能が開始されますが、#menucontainerからのトリガーは除外されます。詳細については、 https://css-tricks.com/dangers-stopping-event-propagation/

10
Jithin B

選択した回答は、1つのドロップダウンメニューでのみ機能します。複数のソリューションの場合:

$('body').click(function(event){
   $dropdowns.not($dropdowns.has(event.target)).hide();
});
5

動作する別の複数のドロップダウンの例 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>
4
Y. Özdemir