jQuery 下拉菜单通过单击外部关闭

IT技术 javascript jquery drop-down-menu
2021-02-07 22:30:34

我正在使用 jQuery 开发一个简单的下拉菜单。当用户按下触发区域时,它将切换下拉区域。我的问题是如何在下拉菜单之外设置点击事件以关闭下拉菜单?

6个回答

您可以告诉任何在 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

那么,这就是这个解决方案运作良好的原因吗?由于您的评论,@JonathanSampson 和@jacob.toye?
2021-03-15 22:30:34
此解决方案并不通用。在某些情况下,它实际上会阻止下拉菜单的显示。
2021-03-16 22:30:34
如果您有两个下拉列表,这将不起作用,因为您将阻止事件触发到文档。
2021-04-07 22:30:34
@jacob.toy 只有当他们停止传播时,他们才会阻止它。
2021-04-08 22:30:34
如果页面上有其他具有单击处理程序的元素,它们可以防止单击事件向下冒泡到文档。
2021-04-12 22:30:34

如何在下拉菜单之外设置点击事件以关闭下拉菜单?这是代码

$(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();
    }
})
我最喜欢的解决方案,因为它允许子元素上的事件正确传播。
2021-03-17 22:30:34
好的!这真的很好用。因此,本质上,这行逻辑container.has(e.target).length === 0检查事件目标是否为 a $('.dropDown'),如果不是,则隐藏subMenu?
2021-03-29 22:30:34

在某些特定元素中停止事件传播可能会变得危险,因为它可能会阻止其他某些脚本运行。所以检查触发是否来自函数内部的排除区域。

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

这里的函数是在点击文档时启动的,但它排除了#menucontainer 的触发。详情https://css-tricks.com/dangers-stopping-event-propagation/

伟大的不引人注目的实施!
2021-04-07 22:30:34

您需要将点击事件附加到某个元素。如果页面上有很多其他元素,您不希望将点击事件附加到所有元素。

一种可能的方法是在下拉菜单下方但在页面上的所有其他元素上方创建一个透明的 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>

+1 整洁的方法。绝对值得一试。值得注意的是,您不需要将点击事件附加到所有其他元素;在大多数情况下,文档级别的单个处理程序就足够了。
2021-04-08 22:30:34

另一个有效的多下拉示例 https://jsfiddle.net/vgjddv6u/