【问题标题】:Close Dropdown when I click outside dropdown单击外部下拉菜单时关闭下拉菜单
【发布时间】:2019-02-14 09:04:16
【问题描述】:

我正在处理另一位开发人员的工作,并试图解决他的疏忽。我们有一个过滤系统,它打开带有复选框的下拉菜单,我们可以通过它过滤列表网格。但是,最初旧的开发人员使用的是 toggleClass,所以我们只能通过再次单击相同的 h3 标签来关闭下拉菜单,这意味着可以堆叠各种下拉菜单。

我设法解决了这个问题,以便单击不同的过滤器 h3 标记将关闭所有下拉菜单,但这将不允许您通过再次单击相同的 h3 标记来关闭下拉菜单。

我决定最方便用户使用的方法是在我单击下拉列表除了的任何位置时关闭下拉列表。

基于这里的一些类似问题,我想出了这个:

$(document).click(function() {
    $(".open_filter").removeClass("open_filter");
});

jQuery('.filter-section h3').on('click', function() {
    jQuery(this).toggleClass('arrow-down');
    if (!jQuery(this).parent().find('.lef-shop-section ul').hasClass('open_filter')){
       jQuery(this).parent().find('.lef-shop-section ul').addClass('open_filter');
    } else {
        $(".open_filter").removeClass("open_filter");
    }
});

我不是 jQuery 方面的佼佼者,我对标准 js 感觉更舒服,但我敢肯定,你可以说,上述方法不起作用,除非我删除 $(document).click(function() 行和那么我只能通过再次单击它的h3 标签来关闭一个下拉菜单,或者单击另一个h3 标签两次以打开一个新标签,然后将它们都关闭。

【问题讨论】:

  • 你为什么同时使用jQuery$
  • 为所有的 SO 用户提供帮助会更好,也更容易
  • @JamesCoyle 旧开发人员使用 jQuery(不知道为什么),我正在使用 $,因为这就是我所理解的......我假设我可以用 $ 替换 jQuery 是否正确?
  • 其他东西可能正在使用$。这通常是使用 jQuery 的唯一原因。
  • @JamesCoyle 很有趣...我已经在我的代码中用 jQuery 替换了所有 $ 实例。它没有改变任何东西,但至少它是一致的。

标签: javascript jquery


【解决方案1】:

这个

$(document).click(function() {
    $(".open_filter").removeClass("open_filter");
});

是一个非常糟糕的解决方案。每次您单击网站上的任何位置时都会触发它。当您单击h3 标签打开下拉列表时也是如此。这就是它立即关闭的原因。

相反,您应该检查单击文档时单击的内容。

$('.filter-section h3').on('click', function() {
  $(this).toggleClass('arrow-down');
  if (!$(this).parent().find('.lef-shop-section ul').hasClass('open_filter')) {
    $('.open_filter').removeClass('open_filter');
    $(this).parent().find('.lef-shop-section ul').addClass('open_filter');
  } else {
    $('.open_filter').removeClass('open_filter');
  }
});

$(document).on('click', function(e) {
  var $target = $(e.target),
    $ul = $target.closest('.filter-section').find('.lef-shop-section ul');

  if (typeof $ul === "undefined" || !$ul.hasClass('open_filter')) {
    $(this).removeClass('arrow-down');
    $('.open_filter').removeClass('open_filter');
  }
});
body {
  width: 100vw;
  height: 100vh;
}

.filter-section .lef-shop-section ul {
  display: none;
}

.filter-section .lef-shop-section ul.open_filter {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="filter-section">
  <h3>Click me to open dropdown, clcik anywhere else to close it</h3>
  <div class="lef-shop-section">
    <ul>
      <li>Position 1</li>
      <li>Position 2</li>
      <li>Position 3</li>
      <li>Position 4</li>
      <li>Position 5</li>
    </ul>
  </div>
</div>
<div class="filter-section">
  <h3>Click me to open dropdown, clcik anywhere else to close it</h3>
  <div class="lef-shop-section">
    <ul>
      <li>Position 1</li>
      <li>Position 2</li>
      <li>Position 3</li>
      <li>Position 4</li>
      <li>Position 5</li>
    </ul>
  </div>
</div>

【讨论】:

  • 遗憾的是这不起作用。结果和原来的问题一样,我可以打开多个下拉菜单,而当另一个下拉菜单打开时,其中任何一个都不会关闭,并且在下拉菜单之外单击仍然不会关闭它。
  • 好的,那么如果您可以在您的帖子中添加对重现问题的小提琴将非常有帮助。
  • 你是对的。显然blur 不适用于h3 标签。我会在一秒钟内更新我的答案。
  • 不幸的是,要么是因为它是基于 Wordpress 构建的,要么是因为我是个白痴,我一直无法在 jsfiddle 上复制它,可能是因为从各种 . php 文件。
  • @ConnorHandley 现在看看
猜你喜欢
  • 1970-01-01
  • 2017-03-23
  • 2023-02-23
  • 2021-09-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多