my_courses_dropdown.js 2.45 KB
Newer Older
Matthew Mongeau committed
1
$(document).ready(function () {
2 3 4 5 6 7 8 9 10
  // define variables for code legibility
  var dropdownMenuToggle = $('a.dropdown');
  var dropdownMenu = $('ul.dropdown-menu');
  var menuItems = dropdownMenu.find('a');
  
  // bind menu toggle click for later use
  dropdownMenuToggle.toggle(function() {
    dropdownMenu.addClass("expanded").find('a').first().focus();
    dropdownMenuToggle.addClass("active").attr("aria-expanded", "true");
Matthew Mongeau committed
11
  }, function() {
12 13
    dropdownMenu.removeClass("expanded");
    dropdownMenuToggle.removeClass("active").attr("aria-expanded", "false").focus();
Matthew Mongeau committed
14
  });
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
  
  //catch keypresses when focused on dropdownMenuToggle (we only care about spacebar keypresses here)
  dropdownMenuToggle.on('keydown', function(event){
    // if space key pressed
    if ( event.which == 32) {
      dropdownMenuToggle.click();
      event.preventDefault();
    }
  });
  
  //catch keypresses when inside dropdownMenu (we want to catch spacebar; escape; up arrow or shift+tab; and down arrow or tab)
  dropdownMenu.on('keydown', function(event){
    catchKeyPress($(this), event);
  });
  
  function catchKeyPress(object, event) {
    // get currently focused item
    var focusedItem = jQuery(':focus');

    // get the number of focusable items
    var numberOfMenuItems = menuItems.length

    // get the index of the currently focused item
    var focusedItemIndex = menuItems.index(focusedItem);
    
    // var to store next focused item index
    var itemToFocusIndex;
    
    // if space key pressed
    if ( event.which == 32) {
      dropdownMenuToggle.click();
      event.preventDefault();
    }
    
    // if escape key pressed
    if (event.which == 27) {
      dropdownMenuToggle.click();
      event.preventDefault();
    }
    
    // if up arrow key pressed or shift+tab
    if (event.which == 38 || (event.which == 9 && event.shiftKey)) {
      // if first item go to last
      if (focusedItemIndex === 0) {
        menuItems.last().focus();
      } else {
        itemToFocusIndex = focusedItemIndex - 1;
        menuItems.get(itemToFocusIndex).focus();
      }
      event.preventDefault();
    }
    
    // if down arrow key pressed or tab key
    if (event.which == 40 || event.which == 9) {
      // if last item go to first
      if (focusedItemIndex == numberOfMenuItems - 1) {
        menuItems.first().focus();
      } else {
        itemToFocusIndex = focusedItemIndex + 1;
        menuItems.get(itemToFocusIndex).focus();
      }
      event.preventDefault();
    }
  }
});