hello-theme/assets/dev/js/frontend/hello-frontend.js
Rami Yushuvaev 54b18f1043
Tweak: Replace jQuery code with vanilla JS in frontend [ED-13040] (#353)
* Tweak: Replace jQuery code with vanilla JS in frontend

* update

* lint

* Fix resize event listeners

* Update

* Update

* Add optional chaining

* update

* update

* update
2023-12-12 15:56:48 +02:00

82 lines
3 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.menuToggle.addEventListener( 'keyup', ( event ) => {
const ENTER_KEY = 13;
const SPACE_KEY = 32;
if ( ENTER_KEY === event.keyCode || SPACE_KEY === event.keyCode ) {
event.currentTarget.click();
}
} );
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.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();
} );