jQuery tab and shift+tab to show navigation

久未见 提交于 2019-12-13 07:40:11

问题


I'm trying to show sub navigation when tabbing on parent items and then hide when tabbing or shift+tabbing out of sub-menu.

Here's my JS. I have the first and last statements working, but can't get the last. What am I doing wrong?

// Show Child Navigation
    jQuery('.has-child, .currenthas-child').keydown( function(e) {
        if (e.keyCode == 9 && !e.shiftKey) {
          	jQuery(this).children().show();
        }
    });
    
    
    //SHIFT + TAB BUTTON
    jQuery('.submenu li:first-child').keydown( function(e) {
        if (e.keyCode == 9 && e.shiftKey) {
          	jQuery(this).parent().hide();
          	console.log("tab first");
        }
    });
    
    //TAB BUTTON
    jQuery('.submenu li:last-child').keydown( function(e) {
        if (e.keyCode == 9 && !e.shiftKey) {
          	jQuery(this).parent().hide();
         	console.log("tab last");
        }
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav role="navigation">
        <button class="menu-toggle" aria-label="Navigation menu"></button>
        <ul class="menu">
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu" style="display: block;">
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu" style="display: none;">
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu">
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu">
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu">
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
        </ul>
    </nav>

回答1:


Something like this?

[Has sub-sub-menus and hides siblings when showing current. To not hide siblings, simply remove code after .end() in the li.keydown event]

/*  Here i simply assign each event to a variable for easy implimintation.  */
var myEvents = {
  click: function(e) {
    jQuery(this).children('ul').show().end().siblings('li').find('ul').hide();
  },
  keydown: function(e) {
    e.stopPropagation();
    if (e.keyCode == 9) {
      
      if (!e.shiftKey && jQuery('nav li').index(jQuery(this)) == (jQuery('nav li').length-1)) jQuery('nav li:first').focus();
      else if (e.shiftKey && jQuery('nav li').index(jQuery(this)) === 0) jQuery('nav ul:first > li:last').focus().blur();
    }
  },
  keyup: function(e) {
    e.stopPropagation();
    if (e.keyCode == 9) {
      if (myEvents.cancelKeyup) myEvents.cancelKeyup = false;
      else myEvents.click.apply(this, arguments);
    }
  }
}
jQuery(document)
  .on('click', 'li', myEvents.click)
  .on('keydown', 'li', myEvents.keydown)
  .on('keyup', 'li', myEvents.keyup)

//  this is needed to keep tabbing focus correct
jQuery('nav li').each(function(i) { this.tabIndex = i; });

/* Below is simply for making menus with sub menues more noticable  */
jQuery('li').each(function(i) { if (jQuery(this).children('ul').length) jQuery(this).addClass('highlight'); });
li ul { display: none; }
.highlight > a { background: yellow; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav role="navigation">
        <button class="menu-toggle" aria-label="Navigation menu">Button</button>
        <ul class="menu">
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu">
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li>
                      <a href="#">Menu Item</a>
                      <ul class="submenu">
                        <li><a href="#">Menu Item</a></li>
                        <li><a href="#">Menu Item</a></li>
                        <li>
                          <a href="#">Menu Item</a>
                          <ul class="submenu">
                            <li><a href="#">Menu Item</a></li>
                            <li><a href="#">Menu Item</a></li>
                            <li><a href="#">Menu Item</a></li>
                            <li><a href="#">Menu Item</a></li>
                          </ul>
                        </li>
                        <li><a href="#">Menu Item</a></li>
                        <li><a href="#">Menu Item</a></li>
                      </ul>
                    </li>
                </ul>
            </li>
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu">
                    <li><a href="#">Menu Item</a></li>
                    <li>
                      <a href="#">Menu Item</a>
                      <ul class="submenu">
                        <li><a href="#">Menu Item</a></li>
                        <li><a href="#">Menu Item</a></li>
                        <li><a href="#">Menu Item</a></li>
                        <li><a href="#">Menu Item</a></li>
                      </ul>
                    </li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu">
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu">
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
            <li class="has-child">
                <a href="#">Menu Item</a>
                <ul class="submenu">
                    <li><a href="#">Menu Item</a></li>
                </ul>
            </li>
        </ul>
    </nav>


来源:https://stackoverflow.com/questions/35657589/jquery-tab-and-shifttab-to-show-navigation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!