如何以编程方式打开 Bootstrap 下拉菜单

Posted

技术标签:

【中文标题】如何以编程方式打开 Bootstrap 下拉菜单【英文标题】:How to open Bootstrap dropdown programmatically 【发布时间】:2014-05-15 14:13:33 【问题描述】:

当我单击另一个下拉列表中的项目时,我正在尝试打开 Bootstrap 下拉列表。

这个想法是从第一个下拉列表中选择一个城市 - 然后脚本将自动打开带有区域的第二个下拉列表(并仅显示与所选城市对应的区域)。

这是我的 JS:

$('#sidebar_filter_city li').click(function()   
    $('#sidebar_filter_areas').dropdown('toggle');
);

这是 html

<div class="dropdown form-control">
   <div data-toggle="dropdown" id="sidebar_filter_cities" class="sidebar_filter_menu" data-value="jersey-city">Jersey City<span class="caret caret_sidebar"></span></div>           
   <input type="hidden" name="advanced_city" value="jersey-city">
   <ul id="sidebar_filter_city" class="dropdown-menu filter_menu" role="menu" aria-labelledby="sidebar_filter_cities">
      <li role="presentation" data-value="">All Cities</li>
      <li role="presentation" data-value="jersey-city">Jersey City</li>
      <li role="presentation" data-value="london">London</li>
      <li role="presentation" data-value="new-york">New York</li>
   </ul>        
   </div>
</div>

<div class="dropdown form-control">
    <div data-toggle="dropdown" id="sidebar_filter_areas" class="sidebar_filter_menu">All Areas<span class="caret caret_sidebar"></span> </div>           
        <input type="hidden" name="advanced_area" value="">
           <ul id="sidebar_filter_area" class="dropdown-menu filter_menu" role="menu" aria-labelledby="sidebar_filter_areas">
               <li role="presentation" data-value="">All Areas</li>
               <li role="presentation" data-value="east-harlem" data-parentcity="">East Harlem</li>
               <li role="presentation" data-value="greenville" data-parentcity="">Greenville</li>
               <li role="presentation" data-value="manhattan" data-parentcity="">Manhattan</li>
               <li role="presentation" data-value="northern-***lyn" data-parentcity="">Northern ***lyn</li>

                  .....
           </ul>        
        </div>    
</div>

【问题讨论】:

【参考方案1】:

最好的方法是检查下拉菜单是否尚未打开,然后使用.dropdown('toggle')

需要注意的几件事:

如果你想通过点击另一个元素来触发它,你必须 杀死另一个元素上的点击事件-否则 Bootstrap 将 将其视为下拉菜单之外的点击并立即将其关闭。 $('.dropdown').addClass('open') 不是一个好的替代品 $('.dropdown-toggle').dropdown('toggle') 其他建议 答案,因为它会导致下拉菜单保持永久打开 而不是在您单击组件时关闭。

HTML:

<button class="btn btn-secondary trigger_button">Trigger dropdown</button><br><br>
<div class="dropdown">
  <button class="btn btn-secondary dropdown-toggle" type="button" data-toggle="dropdown">
Dropdown
  </button>
  <div class="dropdown-menu">
  Stuff...
  </div>
</div>

JS:

$('.trigger_button').click(function(e)
  // Kill click event:
  e.stopPropagation();
  // Toggle dropdown if not already visible:
  if ($('.dropdown').find('.dropdown-menu').is(":hidden"))
    $('.dropdown-toggle').dropdown('toggle');
  
);

Fiddle example

【讨论】:

这是 Twitter Bootstrap 4.0.0-beta.3 中唯一适合我的答案 我怎么没想到?! (如果你想通过点击另一个元素来触发它,你必须杀死另一个元素上的点击事件——否则 Bootstrap 会将它视为下拉菜单之外的点击并立即关闭它 ) 您还应该切换 aria-expanded 属性。 关于“当您单击组件时,它将导致下拉菜单保持永久打开而不是关闭。”。不,它没有。只要我点击任何其他元素,它就会关闭下拉菜单。【参考方案2】:

对于 Bootstrap 3,您只需将“打开”类添加到下拉标签即可。删除它会关闭下拉菜单。

$('.dropdown').addClass('open'); // Opens the dropdown
$('.dropdown').removeClass('open'); // Closes it

这可能适用于其他版本,但我不确定。

【讨论】:

这在 Bootstrap 4 中有效。我很困惑,直到我意识到你必须将它添加到“下拉菜单”。在原生 JS 中: document.getElementsByClassName('.dropdown-menu')[0].classList.add('show') 【参考方案3】:

Bootstrap 的下拉插件等待 'click.bs.dropdown' 事件显示菜单,所以在这种情况下:

$('#sidebar_filter_areas').trigger('click.bs.dropdown');

应该可以。 如果有的话,这不会触发同一元素上的其他“点击”事件。

【讨论】:

为我工作;请务必在带有data-toggle="dropdown" 的元素上调用trigger。与addClass('open') 不同,当您点击离开时,这也会关闭下拉菜单。 我使用的是 Bootstrap 3.3.6,它是 'click.bs.dropdown.data-api' 超级好用 还为我解决其他工具提示问题节省了更多时间。不同事件的相同逻辑【参考方案4】:

dropdown('toggle') 在使用按钮标签时非常适合我。

JS

$("#mybutton").dropdown('toggle')

HTML

<button class="dropdown-toggle ban" role="button" data-toggle="dropdown" data-target="#" id="mybutton">...</button>

【讨论】:

但我确实有一个问题。我收到一个错误:未捕获的 TypeError:“#button”.dropdown 不是函数:在 javascript 控制台中。这正常吗? 打开和切换是不同的东西。如果它已经打开,切换可能会关闭下拉菜单【参考方案5】:

您需要阻止点击事件冒泡到父元素

$('#sidebar_filter_city li').click(function(e)   
    $('#sidebar_filter_areas').dropdown('toggle');
    e.stopPropagation();
);

您也可以使用return false;,它会做同样的事情,但这也会阻止点击时的默认值。

【讨论】:

【参考方案6】:

如果绝对没有人能做到这一点,那么您可以执行以下操作:

$('.dropdown').addClass('open'); // substitute with your own selector
$('.dropdown-toggle').attr('aria-expanded', true).focus(); // substitute with your own selector

虽然上述方法可行,但我不建议使用它,因为它有点 hacky。

【讨论】:

【参考方案7】:

我喜欢使用的东西有更多用户预期的行为:

if(!$('#myDropdown').hasClass('show'))
  $('#myDropdown').dropdown('toggle');

如果它已经打开,不要做任何事情。如果它是关闭的,那么它应该打开。

【讨论】:

【参考方案8】:

这对我有用。

$('.dropdown-toggle').click(function (ev) 
    ev.stopPropagation();

    $(this).parent().toggleClass('open');
);

标记:

<div class="dropdown pull-right">
    <button class="btn btn-default dropdown-toggle task-actions" type="button"
            data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
        <img src=" asset('img/site/icons/menu.svg') " >
    </button>
    <ul id="dropdown-overview" class="dropdown-menu">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
        <li role="separator" class="divider"></li>
        <li><a href="#">Separated link</a></li>
    </ul>
</div>

【讨论】:

【参考方案9】:

只需在 data-toggle 元素上使用 .click() 但不要忘记e.stopPropagation()

这一条简单的线路花了我几个小时,希望对您有所帮助:)

【讨论】:

【参考方案10】:

如果您检查打开的下拉菜单,您可以看到更改下拉菜单显示的选择器。 在 bootstrap v3.0.0 css 选择器是:

.open > .dropdown-menu 
    display: block;

因此,应将开放类添加到具有 .dropdown-menu 类的元素的父节点。在其他版本中,如果已更改,则可能以相同的方式找到正确的选择器。

【讨论】:

【参考方案11】:

根据bootstrap docs,您可以简单地使用这个:

$('.dropdown-toggle').dropdown();

【讨论】:

【参考方案12】:

对于使用 Anuglar 6 的 Bootstrap 4,我使用了这个:

<div class="dropdown-menu" id='logoutDropDownMenu' x-placement="bottom-start" style="position: absolute; transform: translate3d(0px, 40px, 0px); top: 0px; left: 0px; will-change: transform;">

我的组件ts文件有这个功能

 import  DOCUMENT  from '@angular/common';
 import  Inject  from '@angular/core';

export class HomeComponent implements OnInit 

  private toggleLogout: boolean;

  constructor(@Inject(DOCUMENT) private document: any)


 toggleButton() 
    if (this.toggleLogout) 
      this.document.getElementById('logoutDropDownMenu').classList.add('show');
     else 
      this.document.getElementById('logoutDropDownMenu').classList.remove('show');
    
    this.toggleLogout = !this.toggleLogout;

  

【讨论】:

【参考方案13】:

试试这个:

$('#sidebar_filter_areas').click();

【讨论】:

【参考方案14】:

在 Bootstrap 4.x 中,需要影响以下组件:

li > .nav-item .dropdown a > .nav-link > aria-expanded div > .dropdown-menu

为这些类添加一个点击事件监听器,触发切换一个类和一个布尔值,使下拉菜单与纯 javascript 一起工作,如下所示:

let status = false
const nav = document.getElementsByClassName('nav-item dropdown')[0]
nav.addEventListener('click', toggleDropdown)
function toggleDropdown () 
   if (status) 
      nav.classList.add('show')
      document.getElementsByClassName('nav-link dropdown-toggle')[0].setAttribute('aria-expanded', ' + status + ')
      document.getElementsByClassName('dropdown-menu').classList.add('show')
    else 
      nav.classList.remove('show')
      document.getElementsByClassName('nav-link dropdown-toggle')[0].setAttribute('aria-expanded', ' + status + ')
      document.getElementsByClassName('dropdown-menu').classList.remove('show')
   
   return status = !status

【讨论】:

【参考方案15】:

您可以像这样使用原生 JavaScript 实现相同的目标:

 document.getElementById('XYZ').click('open');

它适用于所有浏览器。

【讨论】:

【参考方案16】:

大部分时间都是手动操作:

$('#sidebar_filter_city li').click(function()   
    $('#sidebar_filter_areas').click();
);

【讨论】:

【参考方案17】:

像这样在 HTML 中添加data-toggle="dropdown" id="dropbox"

<div data-toggle="dropdown" id="dropbox" 

在 JS/TS 中:

$('#dropbox').trigger('click.bs.dropdown');

【讨论】:

【参考方案18】:

如果你使用像AngularJS这样的JS框架,你只需要在JS(conditionMenuIsOpen())中实现你的条件,并将dropdown-menudisplay样式绑定到HTML中的这个条件。当条件为真时,display 样式将从hidden 更改为block,并出现下拉菜单。

<ul class="dropdown-menu" ng-style="vm.conditionMenuIsOpen() && 'display':'block'">
  ...
</ul>

【讨论】:

以上是关于如何以编程方式打开 Bootstrap 下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式打开基础 zurb 下拉菜单

从打开的 Bootstrap 3 下拉菜单切换到不同的下拉菜单需要额外点击移动设备

动画下拉菜单 Bootstrap 4

如何在折叠的导航栏中默认打开 Bootstrap 3 下拉菜单

隐藏在 Bootstrap 模式中的下拉菜单

Bootstrap 导航栏下拉子菜单在折叠模式下不起作用