【问题标题】:Avoid dropdown close on clicking outside避免在点击外部时关闭下拉菜单
【发布时间】:2019-08-02 21:27:53
【问题描述】:

避免通过单击外部关闭下拉菜单。仅单击按钮时显示和隐藏下拉菜单。这是fiddle

<div class="dropdown">
  <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">Dropdown Example
  <span class="caret"></span></button>
  <ul class="dropdown-menu">
    <li><a href="#">HTML</a></li>
    <li><a href="#">CSS</a></li>
    <li><a href="#">JavaScript</a></li>
  </ul>
</div>

【问题讨论】:

    标签: jquery bootstrap-4


    【解决方案1】:

    Bootstrap 4 Dropdown 事件与 Bootstrap 3 稍有不同,因此 suggested duplicates(和 here)将阻止下拉菜单在外部点击时关闭。

    对于Bootstrap 4look for the clickEvent,以及在hide 事件中找到时,阻止默认关闭行为。此下拉菜单只会在点击按钮时关闭。

    $('#myDD').on('hide.bs.dropdown', function (e) {
        if (e.clickEvent) {
          e.preventDefault();
        }
    })
    

    Demo


    在某些情况下,您可能希望在单击按钮菜单时关闭下拉菜单。在这种情况下,您可以检查 clickEvent 目标。例如,查找“nav-link”类。

    $('#myDD').on('hide.bs.dropdown', function (e) {
        if (e.clickEvent && e.clickEvent.target.className!="nav-link") {
          e.preventDefault();
        }
    });
    

    Demo 2

    【讨论】:

    • 当你点击一个菜单项时有什么办法让它关闭? OP 没有具体说明,但可能有用。
    • 我确定有,但我没有提供这个答案,因为 OP 说“仅单击按钮时显示和隐藏下拉菜单”。我会用另一个选项更新答案。
    • 为什么我不能在这个jsfiddle.net/Ld46q0za/1@Zim 中实现它
    • 这是不正确的,hide.bs.dropdown 没有 clickEvent 属性
    • 是的,它确实有一个clickEvent属性as explained in the docs,但是“只有当原始事件类型是点击时”
    【解决方案2】:

    我认为您只需要制作自己的菜单切换点击事件,而不是使用引导程序提供的一个然后尝试覆盖事物

    引导程序 3

    var $ddlBtn = $("#my-custom-ddl");
    $ddlBtn.on("click", function(){
      var expanded = /true/i.test($ddlBtn.attr("aria-expanded"));
      $ddlBtn
        .attr("aria-expanded", !expanded)
        .parent().toggleClass("open");
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" type="text/css" href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" />
    
    <div class="dropdown">
      <button class="btn btn-primary dropdown-toggle" type="button" id="my-custom-ddl" aria-haspopup="true" aria-expanded="false">
        Dropdown Example
        <span class="caret"></span>
      </button>
      <ul class="dropdown-menu">
        <li><a href="#">HTML</a></li>
        <li><a href="#">CSS</a></li>
        <li><a href="#">JavaScript</a></li>
      </ul>
    </div>

    引导程序 4

    var $ddlBtn = $("#my-custom-ddl");
    $ddlBtn.on("click", function(){
      var expanded = /true/i.test($ddlBtn.attr("aria-expanded"));
      $ddlBtn
        .attr("aria-expanded", !expanded)
        .siblings(".dropdown-menu").toggleClass("show")
        .parent().toggleClass("show");
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" type="text/css" href="https://netdna.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
    
    <div class="dropdown">
      <button class="btn btn-primary dropdown-toggle" type="button" id="my-custom-ddl" aria-haspopup="true" aria-expanded="false">
        Dropdown Example
        <span class="caret"></span>
      </button>
      <div class="dropdown-menu" aria-labelledby="my-custom-ddl">
        <a class="dropdown-item" href="#">HTML</a>
        <a class="dropdown-item" href="#">CSS</a>
        <a class="dropdown-item" href="#">Javascript</a>
      </div>
    </div>

    【讨论】:

    • 是的,可能是真的,但最初的问题使用 bootstrap 3 CSS 并且从未提及使用哪个版本。
    • 好的,现在更新为包含 3 和 4 的工作示例,还支持 aria-* 属性
    猜你喜欢
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2017-02-12
    • 2017-03-23
    • 2023-02-23
    相关资源
    最近更新 更多