单击关闭时保持 Bootstrap 下拉菜单打开

IT技术 javascript jquery twitter-bootstrap twitter-bootstrap-3 drop-down-menu
2021-01-21 01:50:49

如果下拉菜单可见,我在下拉菜单外单击它会关闭。我需要它不关闭。

从文档:

打开时,插件还会添加.dropdown-backdrop作为单击区域,用于在菜单外单击时关闭下拉菜单。

我可以添加什么 JavaScript 来防止下拉菜单关闭?

6个回答

Bootstrap dropdown文档的事件部分

hide.bs.dropdown: 调用隐藏实例方法时立即触发此事件。

对于初学者来说,为了防止下拉菜单关闭,我们可以只监听这个事件并通过返回来阻止它继续false

$('#myDropdown').on('hide.bs.dropdown', function () {
    return false;
});

对于完整的解决方案,您可能希望在单击下拉菜单时关闭它。所以只有在某些时候我们会想要阻止盒子关闭。

为此,我们将.data()在下拉列表引发的另外两个事件中设置标志:

  • shown.bs.dropdown- 显示时,我们将设置.data('closable')false
  • click- 点击后,我们将设置.data('closable')true

因此,如果hide.bs.dropdown事件是由click下拉列表中的 a 引发的,我们将允许关闭。

jsFiddle 中的现场演示

JavaScript

$('.dropdown.keep-open').on({
    "shown.bs.dropdown": function() { this.closable = false; },
    "click":             function() { this.closable = true; },
    "hide.bs.dropdown":  function() { return this.closable; }
});

HTML (注意我已将类添加keep-open到下拉列表中)

<div class="dropdown keep-open">
    <!-- Dropdown Button -->
    <button id="dLabel" role="button" href="#" class="btn btn-primary"
            data-toggle="dropdown" data-target="#" >
        Dropdown <span class="caret"></span>
    </button>

    <!-- Dropdown Menu -->
    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
        <li class="divider"></li>
        <li><a href="#">Separated link</a></li>
    </ul>
</div>
找到了很多关于该问题的答案,但这是迄今为止最好的答案,并为我节省了相当多的时间。非常感谢你!+1
2021-03-21 01:50:49
@VarunChaddha,你应该问另一个问题,并用 2.x 标记它并链接回这个问题,这样你就可以展示你目前的工作。
2021-03-26 01:50:49
我试过你的 jsfiddle,它似乎不起作用。我单击下拉列表中的任何选项并关闭。我已经尝试过此修复程序和 stopPropogation 修复程序,但似乎没有一个可以阻止下拉列表关闭。有什么建议?
2021-04-03 01:50:49
感谢您的回复@KyleMit。实际上,我可以使用以下代码解决此问题: $j('.cal-options-dropdown .dropdown-menu').on({ "click":function(e){ e.stopPropagation(); } }) ; ...我不知道我是否应该打开新问题并用这个答案自己回答?
2021-04-08 01:50:49
嘿,对不起,我不是有意冒犯,我正在尝试找到类似的解决方案,但在反应。您的代码也不适用于 jquery,您可以在 Mike Kane 的答案中看到更正,这很有效。
2021-04-09 01:50:49

某些依赖项中的版本更改导致 KyleMit 和大多数其他解决方案不再有效。我深入研究了一下,出于某种原因,click()当 Bootstrap 尝试并失败时会发送a hide.bs.dropdown,然后是另一个调用hide.bs.dropdown. 我通过强制关闭click()按钮本身而不是整个下拉菜单来解决这个问题

Bootply 中的现场演示

JavaScript

$('.keep-open').on({
    "shown.bs.dropdown": function() { $(this).attr('closable', false); },
    //"click":             function() { }, // For some reason a click() is sent when Bootstrap tries and fails hide.bs.dropdown
    "hide.bs.dropdown":  function() { return $(this).attr('closable') == 'true'; }
});

$('.keep-open').children().first().on({
  "click": function() {
    $(this).parent().attr('closable', true );
  }
})

HTML

<h2>Click the dropdown button </h2>
<p>It will stay open unless clicked again to close </p>

<div class="dropdown keep-open">
    <!-- Dropdown Button -->
    <button id="dLabel" role="button" href="#" data-toggle="dropdown" data-target="#" class="btn btn-primary">
        Dropdown <span class="caret"></span>
    </button>
    
    <!-- Dropdown Menu -->
    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
        <li class="divider"></li>
        <li><a href="#">Separated link</a></li>
    </ul>
</div>

$('.dropdown.keep-open').on({
    "shown.bs.dropdown": function() { this.closable = true; },
    "click":             function(e) { 
        var target = $(e.target);
        if(target.hasClass("btn-primary")) 
            this.closable = true;
        else 
           this.closable = false; 
    },
    "hide.bs.dropdown":  function() { return this.closable; }
});
body {
    margin: 10px;
}
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<h2>Click the dropdown button </h2>
<p>It will stay open unless clicked again to close </p>

<div class="dropdown keep-open">
    <!-- Dropdown Button -->
    <button id="dLabel" role="button" href="#"
       data-toggle="dropdown" data-target="#" 
       class="btn btn-primary">
        Dropdown <span class="caret"></span>
    </button>
    
    <!-- Dropdown Menu -->
    <ul class="dropdown-menu" role="menu" 
        aria-labelledby="dLabel">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
        <li class="divider"></li>
        <li><a href="#">Separated link</a></li>
    </ul>
</div>




<!-- Post Info -->
<div style='position:fixed;bottom:0;left:0;    
            background:lightgray;width:100%;'>
    About this SO Question: <a href='http://stackoverflow.com/q/19740121/1366033'>Keep dropdown menu open</a><br/>
    Fork This Skeleton Here <a href='http://jsfiddle.net/KyleMit/kcpma/'>Bootrsap 3.0 Skeleton</a><br/>
    Bootstrap Documentation: <a href='http://getbootstrap.com/javascript/#dropdowns'>Dropdowns</a><br/>
<div>

我找到了一个不需要新js的解决方案。不要使用下拉菜单,而是使用引导程序折叠。我仍然使用一些下拉类将其设置为下拉样式。

<div class="dropdown">
    <button class="dropdown-toggle" type="button" data-toggle="collapse" data-target="#myList">Drop Down
    <span class="caret"></span></button>
    <div id="myList" class="dropdown-menu">
        <input type="checkbox" name="vehicle" value="Bike"> I have a bike<br>
        <input type="checkbox" name="vehicle" value="Car"> I have a car<br></div>
正是我所需要的。顺便说一句,你错过了一个结束 </div>
2021-03-23 01:50:49
谢谢它真的帮了我很多!
2021-03-27 01:50:49
这有效,但在显示下拉菜单(引导程序 4)方面有轻微的滞后。
2021-03-30 01:50:49

我设法结合使用上面的 KyleMitt 解决方案,并在 Footable 对象中使用它时遇到了问题(我相信这是由于表格的动态创建)。我将 .keep-open 应用于顶层的 .dropdown .div 。

$('#contact_table').on("click", '.keep-open', function () {
    this.closable = false;
});

$('#contact_table').on("shown.bs.dropdown", '.keep-open', function () {
    this.closable = true;
});
$('#contact_table').on("hide.bs.dropdown", '.keep-open', function () {
    let ret = this.closable;
    this.closable = true;
    return ret;
});

此代码的功能允许您单击外部以关闭下拉列表,但单击其中的项目将使其保持打开状态。如果您对此有任何建议/意见,请告诉我,我会尝试进行编辑。