引导下拉菜单在单击时关闭

Posted

技术标签:

【中文标题】引导下拉菜单在单击时关闭【英文标题】:Bootstrap dropdown closing when clicked 【发布时间】:2012-06-07 11:51:35 【问题描述】:

我在引导下拉菜单中放置了一个表单,但是当我单击表单中的任何字段时,下拉菜单就会消失。我有这段代码,但我不知道把它放在哪里以防止下拉菜单消失。

$(function test() 
  // Setup drop down menu
  $('.dropdown-toggle').dropdown();

  // Fix input element click problem
  $('.dropdown input, .dropdown label').click(function(e) 
    e.stopPropagation();
  );
);

谁能告诉我我应该把这个放在哪里?我在 bootstrap-dropdown 中尝试过,我在 html 中尝试过,但它仍然无法正常工作。

【问题讨论】:

【参考方案1】:

您可以完全省略下拉调用,没有它,引导下拉菜单也可以工作。确保正确包装脚本,可以将其包含在页面的页眉或正文中,尽管我个人更喜欢将其放在页面的正文中。

JS

<script type="text/javascript">
    $('.dropdown-menu input, .dropdown-menu label').click(function(e) 
        e.stopPropagation();
    );
</script>

【讨论】:

我已经把它放在body里了,还是不行,我可以把它放在之后,我的第一个之前吗? @SorinCioban 你试图阻止点击事件的传播是什么表单元素?顶行仅针对输入和标签表单元素。您的下拉表单中是否还有其他可用的表单元素?另外,.dropdown-menu 容器是表单元素的父级吗? 现在好了。我没有将脚本放置在正确的位置。另外,我需要那个 $('.dropdown-toggle').dropdown();声明,因为我在下拉菜单中有一个表格。因此,如果没有它,变量将不会传播到我用于表单的脚本中的 $_POST。 在没有e.stopPropagation(); 的情况下还有其他方法可以解决这个问题吗?在我的情况下,我的下拉菜单中有一个元素需要在单击后显示一个确认框 - 当此方法处于活动状态时,确认框不起作用【参考方案2】:

感谢您的上述回答,我在下拉菜单下的子菜单中遇到了同样的问题。使用上述解决方案,我也能够解决这个问题。

$('.dropdown-menu .dropdown-submenu a[data-toggle="dropdown-submenu"]').click(function (e)
                   
    e.stopPropagation();
);

【讨论】:

【参考方案3】:

自答案被接受以来已经过去了一段时间,但如果你想保持下拉菜单打开,如果它像一种对话框一样,我认为最好的方法是:

$('.dropdown').dropdown().on("hide.bs.dropdown", function(e) 
            if ($.contains(dropdown, e.target)) 
                e.preventDefault();
            //or return false;
            
        );

【讨论】:

我正在尝试这种方法,但下拉菜单现在根本没有出现【参考方案4】:

这适用于我的(侧边栏打开一个带有引导切换的简单链接)

$('.dropdown').find("a").not('.dropdown-toggle').on("click",function(e)
    e.stopImmediatePropagation();
);

【讨论】:

谢谢!我喜欢这种方法,但是我必须使用 $('dropdown-menu')... 才能让它工作【参考方案5】:

<script type="text/javascript">
    $('.dropdown-menu').click(function(e) 
          e.stopPropagation();
    );
</script>

在原始答案上,删除所有类,然后放入“.dropdown-menu”类,它对我有用。 我在下拉菜单中有一个输入字段。

【讨论】:

很棒而且非常简单。谢谢朋友【参考方案6】:

如果你想停止只关闭一些下拉菜单,而不是全部,那么只需在你的 ul 块中添加一个额外的类:

<ul class="dropdown-menu keep-open-on-click">

并使用此代码:

$(document).on('click', '.dropdown-menu', function(e) 
    if ($(this).hasClass('keep-open-on-click'))  e.stopPropagation(); 
);

【讨论】:

【参考方案7】:

如果您查看下拉小部件来源的底部,您会看到:

$(document)
  .on('click.bs.dropdown.data-api', '.dropdown form', function(e) 
    e.stopPropagation()
  )

所以你有以下选择:

    只需用 form 包装你的下拉菜单 或者您可以为 .dropdown YOUR_SELECTOR 的点击事件添加事件监听器
$(document)
  .on('click.my', '.dropdown some_selector', function(e) 
    e.stopPropagation()
  )

【讨论】:

【参考方案8】:

简单地使用这个例子。这个解决方案对我有用。

<script type="text/javascript">
window.addEvent('domready',function()     
   Element.prototype.hide = function() 
      $(function ()  
        // replace your tab id with myTab
        //<ul id="myTab" class="nav nav-tabs">
        $('#myTab li:eq(1) a').tab('show');
      );      
   ;
);
</script>

希望它会有所帮助。谢谢。

【讨论】:

【参考方案9】:

您需要阻止事件冒泡 DOM 树:

$('.dropdown-menu').click(function(e) 
    e.stopPropagation();
);

event.stopPropagation 阻止事件到达最终由 Bootstrap 隐藏菜单处理的节点。

【讨论】:

以上是关于引导下拉菜单在单击时关闭的主要内容,如果未能解决你的问题,请参考以下文章

Vue js 如何在菜单外单击时关闭引导下拉菜单

单击链接后关闭引导下拉菜单

多级下拉引导

在内部单击时保持 Bootstrap 下拉菜单打开

在输入焦点上打开引导下拉菜单

引导下拉菜单按钮在单击按钮以及单击屏幕时更改