【问题标题】:JQuery dropdown menu opening multiple dropdowns when I need only one open当我只需要打开一个时,JQuery 下拉菜单会打开多个下拉菜单
【发布时间】:2014-12-05 06:39:10
【问题描述】:

基本上,我有一个单独工作的下拉菜单,当您单击按钮时它会打开,如果再次单击它会关闭。现在,如果我要同时打开另一个,那么我的问题是它们都打开了。

现在我确定在实例打开之前关闭它们一定非常简单。但是,如果您看一下这个小提琴:http://jsfiddle.net/g2c10t53/

如果我只是用一些 JQuery 删除所有出现的情况:

$('.dropdown-toggle').attr('aria-expanded',false);
$('.dropdown-menu').removeClass('open');

虽然这在理论上可以让它工作,但我现在不能点击我打开的同一个按钮来关闭它。它什么都不做,所以我可以删除:

$('.dropdown-toggle').attr('aria-expanded',false);

但是,如果我要开始在按钮之间切换,我会遇到一个问题,我必须单击两次才能打开另一个我不想做的下拉菜单。

我一直在尝试找到一种方法,我可以通过 .each() 出现 $('.dropdown-toggle') 检查它的属性 ID 是否等于单击的那个,如果不删除所述下拉列表的出现并更改aria-expanded to false 但我没有运气。

有什么建议吗?谢谢。

【问题讨论】:

  • .btn-group 中可以有更多的button ul 对吗?单击页面中的任何其他按钮时,您是否要关闭所有其他菜单?还是只会崩溃?
  • 这个问题应该有帮助:stackoverflow.com/questions/2868582/…

标签: jquery html css


【解决方案1】:

所以这是我的尝试:

Fiddle goes here

我们所做的是改变了您计算要触发哪些元素的方式:

IF 块

if ($(this).attr('aria-expanded') === "false") {
  var menuID = $(this).attr('id'),
      parentScope = $(this).parent().parent();
  parentScope.find('ul').removeClass('open').attr('aria-expanded', false);
  parentScope.find('ul[aria-labelledby=' + menuID + ']').addClass('open')
  parentScope.find('button[aria-expanded=true]').attr('aria-expanded', false);
  $(this).attr('aria-expanded', true);
}

parentScope 变量可以由文档层次结构中高于菜单的任何节点填充,因此您可以合理地替换该行

var parentScope = $(this).parent().parent();

类似的东西

var parentScope = $(document.body);

我们确保在 .siblings() 受到 div.btn-group 元素的约束之前,我们选择了您的所有 ul 元素。

希望对您有所帮助。

【讨论】:

  • 这很好用,但我希望它可以在整个页面上打开任何内容,而不仅仅是在同一部分。仅在父范围内查看并不理想,因为如果一个下拉菜单位于导航栏中,而另一个下拉菜单位于页面内容的其他位置。
  • @Matthew – parentScope 是一个任意容器。尝试将其设置为$(document.body),它仍然可以工作。
  • 是的,我只是在更改 JS 小提琴以在此处更新和评论,以防其他人遇到类似问题。但是,您的评论适用于此。感谢您的回复。
【解决方案2】:

您想知道用户何时在您的元素之外单击以取消切换:

$(document).click(function(e){
    if($('#menuONE').has(e.target).length === 0) {
        // toggle menu to close
    }
});

这是我见过的大多数网站在用户点击离开菜单时处理关闭菜单的默认方式。您正在检测所有点击并确定点击是否在您的元素之外。 #menuONE 将是您的菜单元素。如果用户点击它,您不希望菜单关闭。

【讨论】:

  • 这根本不是我在我的问题中想要的,但是对于任何希望将此代码完全适应的人来说,这是一个很好的评论。我会投票的。
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
相关资源
最近更新 更多