Scroll to top
document.addEventListener('DOMContentLoaded', function() {
console.log('Iniciando menú acordeón con JS puro...');
// 1. Ocultar todos los submenús al cargar
hideAllSubmenus();
// 2. Re-ocultar después de que todo cargue
setTimeout(hideAllSubmenus, 100);
setTimeout(hideAllSubmenus, 500);
// 3. Agregar evento de clic a todos los enlaces del menú
document.addEventListener('click', function(e) {
var target = e.target;
// Si se hace clic en un enlace que está dentro de un li
if (target.tagName === 'A') {
var liParent = findLiParent(target);
if (liParent) {
var submenu = findSubmenu(liParent);
if (submenu) {
e.preventDefault();
e.stopPropagation();
// Cerrar otros submenús abiertos
closeOtherSubmenus(submenu);
// Abrir/cerrar este submenú
toggleSubmenu(submenu);
}
}
}
});
// 4. Observar cambios en el DOM por si el tema muestra submenús
observeDOMChanges();
});
// Función para ocultar todos los submenús
function hideAllSubmenus() {
var submenus = document.querySelectorAll('.sub-menu, li ul');
submenus.forEach(function(menu) {
menu.style.display = 'none';
menu.style.visibility = 'hidden';
menu.style.opacity = '0';
menu.style.height = '0';
menu.style.overflow = 'hidden';
});
}
// Encontrar el elemento li padre
function findLiParent(element) {
var parent = element.parentElement;
while (parent && parent.tagName !== 'LI' && parent.tagName !== 'BODY') {
parent = parent.parentElement;
}
return parent && parent.tagName === 'LI' ? parent : null;
}
// Encontrar submenú dentro de un li
function findSubmenu(liElement) {
return liElement.querySelector('.sub-menu, ul ul, li > ul');
}
// Cerrar otros submenús
function closeOtherSubmenus(currentSubmenu) {
var allSubmenus = document.querySelectorAll('.sub-menu, li ul');
allSubmenus.forEach(function(menu) {
if (menu !== currentSubmenu) {
menu.style.display = 'none';
menu.style.visibility = 'hidden';
menu.style.opacity = '0';
}
});
}
// Alternar submenú (abrir/cerrar)
function toggleSubmenu(submenu) {
if (submenu.style.display === 'none' || !submenu.style.display) {
// Abrir
submenu.style.display = 'block';
submenu.style.visibility = 'visible';
submenu.style.opacity = '1';
submenu.style.height = 'auto';
submenu.style.overflow = 'visible';
} else {
// Cerrar
submenu.style.display = 'none';
submenu.style.visibility = 'hidden';
submenu.style.opacity = '0';
submenu.style.height = '0';
}
}
// Observar cambios en el DOM para combatir el tema
function observeDOMChanges() {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
// Si se agregan nodos o cambian estilos, re-ocultar submenús
hideAllSubmenus();
});
});
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['style', 'class']
});
}