Advertisement
Guest User

navigation.js

a guest
Sep 4th, 2015
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * navigation.js
  3.  *
  4.  * Handles toggling the navigation menu for small screens and enables tab
  5.  * support for dropdown menus.
  6.  */
  7. ( function() {
  8.     var container, button, menu, links, subMenus;
  9.  
  10.     container = document.getElementById( 'site-navigation' );
  11.     if ( ! container ) {
  12.         return;
  13.     }
  14.  
  15.     button = container.getElementsByTagName( 'button' )[0];
  16.     if ( 'undefined' === typeof button ) {
  17.         return;
  18.     }
  19.  
  20.     menu = container.getElementsByTagName( 'ul' )[0];
  21.  
  22.     // Hide menu toggle button if menu is empty and return early.
  23.     if ( 'undefined' === typeof menu ) {
  24.         button.style.display = 'none';
  25.         return;
  26.     }
  27.  
  28.     menu.setAttribute( 'aria-expanded', 'false' );
  29.     if ( -1 === menu.className.indexOf( 'nav-menu' ) ) {
  30.         menu.className += ' nav-menu';
  31.     }
  32.  
  33.     button.onclick = function() {
  34.         if ( -1 !== container.className.indexOf( 'toggled' ) ) {
  35.             container.className = container.className.replace( ' toggled', '' );
  36.             button.setAttribute( 'aria-expanded', 'false' );
  37.             menu.setAttribute( 'aria-expanded', 'false' );
  38.         } else {
  39.             container.className += ' toggled';
  40.             button.setAttribute( 'aria-expanded', 'true' );
  41.             menu.setAttribute( 'aria-expanded', 'true' );
  42.         }
  43.     };
  44.  
  45.     // Get all the link elements within the menu.
  46.     links    = menu.getElementsByTagName( 'a' );
  47.     subMenus = menu.getElementsByTagName( 'ul' );
  48.  
  49.     // Set menu items with submenus to aria-haspopup="true".
  50.     for ( var i = 0, len = subMenus.length; i < len; i++ ) {
  51.         subMenus[i].parentNode.setAttribute( 'aria-haspopup', 'true' );
  52.     }
  53.  
  54.     // Each time a menu link is focused or blurred, toggle focus.
  55.     for ( i = 0, len = links.length; i < len; i++ ) {
  56.         links[i].addEventListener( 'focus', toggleFocus, true );
  57.         links[i].addEventListener( 'blur', toggleFocus, true );
  58.     }
  59.  
  60.     /**
  61.      * Sets or removes .focus class on an element.
  62.      */
  63.     function toggleFocus() {
  64.         var self = this;
  65.  
  66.         // Move up through the ancestors of the current link until we hit .nav-menu.
  67.         while ( -1 === self.className.indexOf( 'nav-menu' ) ) {
  68.  
  69.             // On li elements toggle the class .focus.
  70.             if ( 'li' === self.tagName.toLowerCase() ) {
  71.                 if ( -1 !== self.className.indexOf( 'focus' ) ) {
  72.                     self.className = self.className.replace( ' focus', '' );
  73.                 } else {
  74.                     self.className += ' focus';
  75.                 }
  76.             }
  77.  
  78.             self = self.parentElement;
  79.         }
  80.     }
  81. } )();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement