Skip to main content
Category

Podcasts

// Mega menu stabilizer for Product(44971) & Industries(44982) — no CSS changes required (function () { var IDS = ['menu-item-44971', 'menu-item-44982']; // Product, Industries var CLOSE_DELAY = 260; // tweak to 300 if needed var DEBUG = false; function log(){ if (DEBUG && window.console) console.log.apply(console, arguments); } function qSub(li){ // Try common wrappers used by Salient/QuadMenu variants return li.querySelector(':scope > .sub-menu') || li.querySelector('.sub-menu') || li.querySelector(':scope > .nectar-megamenu, :scope > .quadmenu-container, :scope > .megamenu') || li.querySelector('.nectar-megamenu, .quadmenu-container, .megamenu'); } function setImp(el, prop, val){ // apply as inline !important so theme rules can't beat it try { el.style.setProperty(prop, val, 'important'); } catch(_) {} } function hide(el){ setImp(el, 'display', 'block'); // keep hover path intact setImp(el, 'opacity', '0'); setImp(el, 'visibility', 'hidden'); setImp(el, 'pointer-events', 'none'); } function show(el){ setImp(el, 'display', 'block'); setImp(el, 'opacity', '1'); setImp(el, 'visibility', 'visible'); setImp(el, 'pointer-events', 'auto'); // ensure it's positioned right under header in case theme changes it setImp(el, 'top', '100%'); setImp(el, 'left', '50%'); setImp(el, 'transform', 'translateX(-50%)'); setImp(el, 'margin-top', '0'); setImp(el, 'padding-top', '0'); setImp(el, 'z-index', '10001'); setImp(el, 'overflow', 'visible'); } function wire(id){ var li = document.getElementById(id); if (!li) return; var sm = qSub(li); if (!sm) return; // initial state hide(sm); var state = { inside:false, timer:null }; function open(){ if (state.timer) clearTimeout(state.timer); state.inside = true; show(sm); li.dataset.open = '1'; log('[mm] open', li.id); } function closeSoon(){ if (state.timer) clearTimeout(state.timer); state.inside = false; state.timer = setTimeout(function(){ if (!state.inside) { hide(sm); delete li.dataset.open; log('[mm] close', li.id); } }, CLOSE_DELAY); } // Use pointer events (better than mouse for nested elements) ['pointerenter','focusin'].forEach(function(ev){ li.addEventListener(ev, open, {passive:true}); }); ['pointerleave','focusout'].forEach(function(ev){ li.addEventListener(ev, closeSoon, {passive:true}); }); sm.addEventListener('pointerenter', function(){ state.inside = true; open(); }, {passive:true}); sm.addEventListener('pointerleave', function(){ closeSoon(); }, {passive:true}); // Keep open while scrolling/wheeling over the submenu sm.addEventListener('wheel', function(e){ state.inside = true; open(); // prevent page scroll from firing theme close handlers try { e.preventDefault(); } catch(_) {} }, {passive:false}); // If any script flips classes/styles, put them back immediately var mo = new MutationObserver(function(){ if (li.dataset.open === '1') show(sm); }); mo.observe(sm, { attributes:true, attributeFilter:['class','style'] }); // First click opens; second click follows var a = li.querySelector(':scope > a') || li.querySelector('a'); if (a){ a.addEventListener('click', function(e){ if (li.dataset.open !== '1') { e.preventDefault(); open(); } }); li.addEventListener('touchstart', function(ev){ if (li.dataset.open !== '1'){ open(); if (ev.target === a) ev.preventDefault(); } }, {passive:true}); } // Re-assert visible if the page scrolls while we're inside the menu region window.addEventListener('scroll', function(){ if (li.dataset.open === '1') show(sm); }, {passive:true}); // Close when clicking completely outside header document.addEventListener('click', function(e){ if (!e.target.closest('#header-outer')) { hide(sm); delete li.dataset.open; } }); } function start(){ IDS.forEach(function(id){ var tries = 0; var t = setInterval(function(){ var li = document.getElementById(id); if (li && qSub(li)){ clearInterval(t); wire(id); log('[mm] wired', id); } else if (++tries > 60) { clearInterval(t); log('[mm] give up', id); } }, 100); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', start); } else { start(); } })();