I'm building a nav menu where the desktop version shows sub-menus as drop-downs that appear on hover, and the mobile version has accordion style sub-menus that are triggered on click/touch.
I have both of these set up using the (simplified) code below, but I want to be able to swap the event listeners as the browser window is resized. I've been trying to use resizeObserver to remove and re-add the event listeners, but I'm having trouble unbinding the listeners correctly.
const viewportWidth = window.innerWidth;
const menuItems = document.querySelectorAll('[data-menu-item]');
function setupMenu() {
menuItems.forEach((item) => {
const itemHandler = toggleState.bind(null, item);
if (viewportWidth > 960) {
item.addEventListener('mouseover', itemHandler);
item.addEventListener('mouseout', itemHandler);
} else {
item.addEventListener('click', itemHandler);
}
});
}
viewportWidth > 960to insideitemHandlerso to check for width when event fires, not on init - Justinas