File "navigation.js"
Full Path: /websites/hqoliveoil/site/wp-content/themes/fairy/js/navigation.js
File size: 2.98 KB
MIME-type: application/javascript
Charset: utf-8
/**
* File navigation.js.
*
* Handles toggling the navigation menu for small screens and enables TAB key
* navigation support for dropdown menus.
*/
(function () {
var container, button, menu, links, i, len;
container = document.getElementById("site-nav-wrap");
nav_tag = document.querySelector(".main-navigation");
if (!container) {
return;
}
button = container.getElementsByTagName("button")[0];
if ("undefined" === typeof button) {
return;
}
menu = container.getElementsByTagName("ul")[0];
// Hide menu toggle button if menu is empty and return early.
if ("undefined" === typeof menu) {
button.style.display = "none";
return;
}
menu.setAttribute("aria-expanded", "false");
if (-1 === menu.className.indexOf("nav-menu")) {
menu.className += " nav-menu";
}
button.onclick = function () {
if (-1 !== nav_tag.className.indexOf("toggled")) {
nav_tag.className = nav_tag.className.replace(" toggled", "");
button.setAttribute("aria-expanded", "false");
menu.setAttribute("aria-expanded", "false");
} else {
nav_tag.className += " toggled";
button.setAttribute("aria-expanded", "true");
menu.setAttribute("aria-expanded", "true");
}
};
// Get all the link elements within the menu.
links = menu.getElementsByTagName("a");
// Each time a menu link is focused or blurred, toggle focus.
for (i = 0, len = links.length; i < len; i++) {
links[i].addEventListener("focus", toggleFocus, true);
links[i].addEventListener("blur", toggleFocus, true);
}
/**
* Sets or removes .focus class on an element.
*/
function toggleFocus() {
var self = this;
// Move up through the ancestors of the current link until we hit .nav-menu.
while (-1 === self.className.indexOf("nav-menu")) {
// On li elements toggle the class .focus.
if ("li" === self.tagName.toLowerCase()) {
if (-1 !== self.className.indexOf("focus")) {
self.className = self.className.replace(" focus", "");
} else {
self.className += " focus";
}
}
self = self.parentElement;
}
}
/**
* Toggles `focus` class to allow submenu access on tablets.
*/
(function (container) {
var touchStartFn,
i,
parentLink = container.querySelectorAll(
".menu-item-has-children > a, .page_item_has_children > a"
);
if ("ontouchstart" in window) {
touchStartFn = function (e) {
var menuItem = this.parentNode,
i;
if (!menuItem.classList.contains("focus")) {
e.preventDefault();
for (i = 0; i < menuItem.parentNode.children.length; ++i) {
if (menuItem === menuItem.parentNode.children[i]) {
continue;
}
menuItem.parentNode.children[i].classList.remove("focus");
}
menuItem.classList.add("focus");
} else {
menuItem.classList.remove("focus");
}
};
for (i = 0; i < parentLink.length; ++i) {
parentLink[i].addEventListener("touchstart", touchStartFn, false);
}
}
})(container);
})();