mirror of
https://github.com/elementor/hello-theme.git
synced 2025-10-03 15:33:37 +08:00
76 lines
2.7 KiB
JavaScript
76 lines
2.7 KiB
JavaScript
class elementorHelloThemeHandler {
|
|
constructor() {
|
|
this.initSettings();
|
|
this.initElements();
|
|
this.bindEvents();
|
|
}
|
|
|
|
initSettings() {
|
|
this.settings = {
|
|
selectors: {
|
|
menuToggle: '.site-header .site-navigation-toggle',
|
|
menuToggleHolder: '.site-header .site-navigation-toggle-holder',
|
|
dropdownMenu: '.site-header .site-navigation-dropdown',
|
|
},
|
|
};
|
|
}
|
|
|
|
initElements() {
|
|
this.elements = {
|
|
window,
|
|
menuToggle: document.querySelector( this.settings.selectors.menuToggle ),
|
|
menuToggleHolder: document.querySelector( this.settings.selectors.menuToggleHolder ),
|
|
dropdownMenu: document.querySelector( this.settings.selectors.dropdownMenu ),
|
|
};
|
|
}
|
|
|
|
bindEvents() {
|
|
if ( ! this.elements.menuToggleHolder || this.elements.menuToggleHolder?.classList.contains( 'hide' ) ) {
|
|
return;
|
|
}
|
|
|
|
this.elements.menuToggle.addEventListener( 'click', () => this.handleMenuToggle() );
|
|
|
|
this.elements.dropdownMenu.querySelectorAll( '.menu-item-has-children > a' )
|
|
.forEach( ( anchorElement ) => anchorElement.addEventListener( 'click', ( event ) => this.handleMenuChildren( event ) ) );
|
|
}
|
|
|
|
closeMenuItems() {
|
|
this.elements.menuToggleHolder.classList.remove( 'elementor-active' );
|
|
this.elements.window.removeEventListener( 'resize', () => this.closeMenuItems() );
|
|
}
|
|
|
|
handleMenuToggle() {
|
|
const isDropdownVisible = ! this.elements.menuToggleHolder.classList.contains( 'elementor-active' );
|
|
|
|
this.elements.menuToggle.setAttribute( 'aria-expanded', isDropdownVisible );
|
|
this.elements.dropdownMenu.setAttribute( 'aria-hidden', ! isDropdownVisible );
|
|
this.elements.dropdownMenu.inert = ! isDropdownVisible;
|
|
this.elements.menuToggleHolder.classList.toggle( 'elementor-active', isDropdownVisible );
|
|
|
|
// Always close all sub active items.
|
|
this.elements.dropdownMenu.querySelectorAll( '.elementor-active' ).forEach( ( item ) => item.classList.remove( 'elementor-active' ) );
|
|
|
|
if ( isDropdownVisible ) {
|
|
this.elements.window.addEventListener( 'resize', () => this.closeMenuItems() );
|
|
} else {
|
|
this.elements.window.removeEventListener( 'resize', () => this.closeMenuItems() );
|
|
}
|
|
}
|
|
|
|
handleMenuChildren( event ) {
|
|
const anchor = event.currentTarget;
|
|
const parentLi = anchor.parentElement;
|
|
|
|
if ( ! parentLi?.classList ) {
|
|
return;
|
|
}
|
|
|
|
parentLi.classList.toggle( 'elementor-active' );
|
|
}
|
|
}
|
|
|
|
document.addEventListener( 'DOMContentLoaded', () => {
|
|
new elementorHelloThemeHandler();
|
|
} );
|
|
|