从点击结束时停止一个下拉菜单

我有一个button下拉(只有一个,不是所有的),在里面,我想有几个input字段,人们可以在里面input的东西没有下拉隐藏一旦你点击它(但它确实closures如果你点击它之外)。

我创build了一个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>​ 

所以基本上,我希望它不会closures点击下拉(但closures点击的动作button或下拉之外)。 到目前为止,我最好的猜测是添加一个类,并尝试做一些JS,但我无法弄清楚。

谢谢你的帮助。

问题是,当你点击其他任何地方的时候,boostrap下拉式jQuery插件closures了drop-menu。 您可以通过捕获下拉菜单元素上的点击事件并阻止其到达body元素上的click事件侦听器来禁用该行为。

只需添加

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

jsfiddle可以在这里find

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

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

实际上,如果你在Angular.js中,那么为它做一个指令将会更加优雅:

 app.directive('stopClickPropagation', function() { return { restrict: 'A', link: function(scope, element) { element.click(function(e) { e.stopPropagation(); }); } }; }); 

然后,在下拉菜单中,添加指令:

 <div class="dropdown-menu" stop-click-propagation> my dropdown content... <div> 

特别是如果你想停止传播多个鼠标事件:

 ... element.click(function(e) { e.stopPropagation(); }); element.mousedown(... element.mouseup(... ... 

另一个快速的解决scheme,只需添加onclick属性的div类有dropdown-menu

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

在尝试了很多技术之后,我发现最好的一个使用这个技术,这不会导致很简单的缺点:

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

这可以让你也做一些实时绑定内部下拉列表元素。

另外,防止点击,除非点击一个button元素

 $('.dropdown-menu').click(function(e) { if (e.target.nodeName !== 'BUTTON') e.stopPropagation(); }); 

我有这个问题,但在一个反应​​组件 – 反应组件是在一个窗体的引导下拉菜单。 每次单击下拉菜单中的某个元素时,都会closures,导致input任何内容。

通常的e.preventDefault()e.stopPropagation()在响应应用程序中不起作用,因为jquery事件被立即触发,并在之后尝试干预。

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

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

或以ES6格式

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

希望这可以用于任何与其他答案挣扎的人试图在反应中使用它。