首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能以子元素为目标

问不能以子元素为目标
EN

Stack Overflow用户
提问于 2015-09-22 07:18:04
回答 2查看 165关注 0票数 0

当顶层菜单项被单击时,我正在尝试制作一个简单的向下滑动菜单。我正在寻找的功能是,当一个顶层菜单项被单击时,所有其他的子菜单都向上滑动,而被单击的子菜单向下滑动,当您单击相同的菜单项时,子菜单项向上滑动。

我遇到的问题是将子ul标记作为目标

代码语言:javascript
复制
<ul>
  <li class="main-menu-item">
    <a href="#"></a>
    <ul class="sub-menu">
      <li>Stuff</li>
    </ul>
  </li>
</ul>

这是我的jQuery

代码语言:javascript
复制
(function( $ ) {
    'use strict';
    $(function() {

        var menuItem = $('#nav__menu li.main-menu-item'),
                subMenuItem = $('#nav__menu ul.sub-menu' );
        // setup
        menuItem.parents().attr('tabIndex',-1).attr('aria-haspopup',true);
        subMenuItem.attr('aria-hidden', true);

        menuItem.on('click', function(e) {
            e.preventDefault();
            $(this).toggleClass('active');
            $(this).siblings('.active').removeClass('active');
        });
        subMenuItem.each(function() {
            if($(this).parents().hasClass('active')) { 
          $(this).find(subMenuItem).attr('aria-hidden', false).slideDown();
        } else {
          $(this).find(subMenuItem).attr('aria-hidden', true).slideup(); 
        }
        });
    });
})( jQuery );

JS Fiddle

EN

回答 2

Stack Overflow用户

发布于 2015-09-22 08:00:13

您的子菜单代码需要在menuItem代码的单击函数中,否则它只会在页面加载时执行一次。您还拥有两个准备好DOM的函数,并且不止一次选择对象。

您不需要在加载时定义子菜单项,然后遍历所有子菜单项,查找具有活动父项的子菜单项。为此,您可以使用children()或find()。

https://jsfiddle.net/Lt34k1n3/2/

代码语言:javascript
复制
(function( $ ) {
    'use strict';
    $('#nav__menu li.main-menu-item') // select this once
        .attr('tabIndex',-1).attr('aria-haspopup',true) // apply attributes
        .find('ul.sub-menu') // find the child dropdown
            .attr('aria-hidden', true) // set attrs on that
            .slideUp() // and slide up
        .end() // go back up to #nav__menu li.main-menu-item
        .on('click', function(e) {
            e.preventDefault();
            $(this)
                .addClass('active') // remove active class
                .find('ul.sub-menu') // find child dd
                    .attr('aria-hidden', false)
                    .slideDown() // set attrs
                .end() // back up to $(this) which is still #nav__menu li.main-menu-item
                .siblings() // select its siblings
                    .removeClass('active')
                    .find('ul.sub-menu') // find these to close them
                        .attr('aria-hidden', true)
                        .slideUp()
        });

})( jQuery );

如果您想要切换单击的项,您将使用slideToggle和toggleClass,而不是slideDown和addClass,并且您需要为aria-hidden属性创建布尔值,您可以通过颠倒$(this).closest('ul.sub-menu').hasClass('active')的结果来实现这一点,这意味着“祖先"ul.sub-menu”是否具有“活动”类?“

代码语言:javascript
复制
        $(this)
            .toggleClass('active')
            .find('ul.sub-menu')
                .attr('aria-hidden', !$(this).closest('ul.sub-menu').hasClass('active'))
                .slideToggle()
            .end()
票数 1
EN

Stack Overflow用户

发布于 2015-09-22 09:24:31

我发现了一个非常简单的例子,适用于我。

代码语言:javascript
复制
(function( $ ) {
  'use strict';
    var $menuItem = $('#nav__menu li.menu-item-has-children'),
      $subMenuItem = $('#nav__menu ul.sub-menu' );
    // setup
    $menuItem.addClass('closed').attr('tabIndex',-1).attr('aria-haspopup',true);
    $subMenuItem.attr('aria-hidden', true);
    $($menuItem).on('click', function() {
        $(this).siblings('li').removeClass('open').addClass('closed').children('ul').hide();
        if($(this).hasClass('closed')){
            $(this).removeClass('closed').addClass('open');
            $(this).children('ul').slideDown();
        } else if($(this).hasClass('open')){
            $(this).removeClass('open').addClass('closed');
            $(this).children('ul').slideUp();
        }
    })
})( jQuery );

我希望这能帮助其他人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32705997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档