从关闭点击停止只有一个下拉切换

时间:2012-07-23 17:00:24

标签: javascript drop-down-menu twitter-bootstrap

我有一个按钮下拉列表(只有一个,而不是全部),并且在其中,我想要有几个输入字段,人们可以在内部输入内容而不会在您点击它时隐藏下拉列表(但它如果你点击它外面会关闭。)

我创建了一个jsfiddle:http://jsfiddle.net/denislexic/8afrw/2/

这是代码,它是基本的:

<div class="btn-group" style="margin-left:20px;">
  <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
    Action
    <span class="caret"></span>
  </a>
  <ul class="dropdown-menu">
    <!-- dropdown menu links -->
      <li>Email<input type="text" place-holder="Type here" /></li>
      <li>Password<input type="text" place-holder="Type here" /></li>
  </ul>
</div>​

所以基本上,我希望它不会在点击下拉菜单时关闭(但是单击操作按钮或在下拉列表外关闭)。到目前为止,我最好的猜测是为它添加一个类并尝试做一些JS,但我无法弄明白。

感谢您的帮助。

6 个答案:

答案 0 :(得分:111)

问题是当你点击其他任何地方时,boostrap下拉jQuery插件会关闭下拉菜单。您可以通过捕获下拉菜单元素上的单击事件并防止它到达body元素上的click事件侦听器来禁用该行为。

添加

$('.dropdown-menu').click(function(event){
     event.stopPropagation();
 });​

可以找到jsfiddle here

答案 1 :(得分:39)

我知道这个问题不适用于Angular本身,但对于使用Angular的任何人,您可以从HTML传递事件并通过$ event停止传播:

<div ng-click="$event.stopPropagation();">
    <span>Content example</span>
</div>

答案 2 :(得分:5)

另一种快速解决方案,只需将onclick属性添加到具有类dropdown-menu的div:

<div class="dropdown-menu" onClick="event.stopPropagation();">...</div>

答案 3 :(得分:1)

在尝试了很多技术后,我发现使用的最好的技术,没有任何缺点,甚至很简单:

$(document)
.on( 'click', '.dropdown-menu', function (e){
    e.stopPropagation();
});

它还允许您对下拉列表中的内部元素进行一些实时绑定。

答案 4 :(得分:0)

另外,除非点击按钮元素

,否则请阻止点击
$('.dropdown-menu').click(function(e) {
    if (e.target.nodeName !== 'BUTTON') e.stopPropagation();
});

答案 5 :(得分:0)

我遇到了这个问题但是在一个反应​​组件中 - 反应组件位于带有表单的bootstrap下拉菜单中。每次单击下拉列表中的元素时,它都会关闭,导致在表单中输入任何内容时出现问题。

通常e.preventDefault()e.stopPropagation()在反应应用中不起作用,因为jquery事件会立即被触发并在此之后做出干预。

以下代码允许我解决我的问题。

stopPropagation: function(e){
    e.nativeEvent.stopImmediatePropagation();
}

或ES6格式

stopPropagation(e){
    e.nativeEvent.stopImmediatePropagation();
}

希望这对于在尝试使用它时做出其他答案的人来说是有用的。