【问题标题】:Prevent dropdown to close when clicked on menu items单击菜单项时防止下拉菜单关闭
【发布时间】:2018-02-16 15:49:30
【问题描述】:

我正在使用 Bootstrap 4 alpha6。下面是我的下拉html:

<div class="dropdown">
   <button class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" type="button" id="dropdownMenu2" aria-haspopup="true" aria-expanded="false">
   Dropdown
   </button>
   <div class="dropdown-menu" aria-labelledby="dropdownMenu2">
      <h6 class="dropdown-header">
         <input class="form-control form-control-sm" type="text" placeholder="Search">
      </h6>
      <button class="dropdown-item" type="button">Action</button>
      <button class="dropdown-item" type="button">Another action</button>
      <button class="dropdown-item" type="button">Something else here</button>
   </div>
</div>

我想要的是当有人点击.dropdown-menu 中的任何项目时不要关闭下拉菜单。我写了下面的 JS 但它不起作用,这意味着仍然单击菜单项引导下拉菜单正在关闭。

<script type="text/javascript">
  $(function() {
      $('.dropdown-menu button').on('click', function (event) {
        console.log(event)
        event.preventDefault();
      })
  });
</script>

【问题讨论】:

  • 你试过event.stopPropagation吗? api.jquery.com/event.stoppropagationevent.stopImmediatePropagation?
  • 我试过stopPropagation,但不是另一个。让我也试试。
  • @cale_b 还是同样的问题。问题是我也没有看到 console.log 输出..

标签: jquery html twitter-bootstrap bootstrap-4


【解决方案1】:

在您的脚本文件中,您正在寻找下拉菜单类中的 p-tag,但您没有任何 p-tags。试着写: ```

  $('.dropdown-item').on('click', function (event) {
        console.log(event)
        event.preventDefault();
      })

```

【讨论】:

  • 那是我的错字,我改正了。
【解决方案2】:

您需要使用以下事件来代替点击

hide.bs.dropdown: 当调用了 hide 实例方法时立即触发该事件。

当您单击按钮时,可以将数据属性设置为下拉列表以保存状态。在开始时,您可以将此值设置为 false。最后,当下拉菜单隐藏时,您可以测试该值并重置状态。

此事件必须附加到您的 dropdown 元素:

$('.dropdown-menu button').on('click', function(e) {
    $('.dropdown').data('canBeClosed', true);
})
$('.dropdown').data('canBeClosed', false);
$('.dropdown').on('hide.bs.dropdown', function (evt) {
    console.log('Event fired: ' + evt.type);
    if ($('.dropdown').data('canBeClosed') == false) {
        evt.preventDefault();
    } else {
        $('.dropdown').data('canBeClosed', false);
    }
})

$('.dropdown-menu button').on('click', function(e) {
    $('.dropdown').data('canBeClosed', true);
})
$('.dropdown').data('canBeClosed', false);
$('.dropdown').on('hide.bs.dropdown', function (evt) {
    if ($('.dropdown').data('canBeClosed') == false) {
        evt.preventDefault();
    } else {
      $('.dropdown').data('canBeClosed', false);
    }
})
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>


<div class="dropdown">
    <button class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" type="button" id="dropdownMenu2" aria-haspopup="true" aria-expanded="false">
        Dropdown
    </button>
    <div class="dropdown-menu" aria-labelledby="dropdownMenu2">
        <h6 class="dropdown-header">
            <input class="form-control form-control-sm" type="text" placeholder="Search">
        </h6>
        <button class="dropdown-item" type="button">Action</button>
        <button class="dropdown-item" type="button">Another action</button>
        <button class="dropdown-item" type="button">Something else here</button>
    </div>
</div>

【讨论】:

  • 是的,但是当你点击按钮.dropdown-toggle时你不能关闭它。这不是我想要的。
  • 当你在.dropdown之外点击或点击.dropdown-toggle按钮时。
  • 谢谢。在我在 SO 中发布之前,我尝试了您在此处显示的内容,但没有成功。所以在那之后我没有任何想法,就来到了这里。 :) 慢慢来,没问题。
  • @hobby-coder 回答和 sn-p 已更新。我希望它能像你期望的那样工作
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2021-12-26
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多