Files
2026-09-15 10:35:56 +08:00

114 lines
3.4 KiB
JavaScript

define([
'jquery'
], function ($) {
'use strict';
return function (config, element) {
var $navigation = $(element),
mobileQuery = window.matchMedia(config.mediaBreakpoint || '(max-width: 992px)'),
triggerSelector = '.esun-megamenu-trigger > .level-top';
function resetMenus() {
$navigation
.find('.esun-megamenu-trigger')
.removeClass('is-open')
.find('> .esun-megamenu-wrapper')
.css('display', '')
.end()
.find('> .level-top')
.removeClass('ui-state-active')
.attr('aria-expanded', 'false')
.end()
.find('> .esun-megamenu-toggle')
.attr('aria-expanded', 'false');
}
function handleNavigationClick(event) {
var $target = $(event.target),
$item = $target.closest('.esun-megamenu-trigger'),
$contentLink = $target.closest('a.esun-product-link, a.esun-view-all'),
$trigger,
$linkedToggle,
willOpen;
if (mobileQuery.matches && $contentLink.length) {
event.preventDefault();
event.stopImmediatePropagation();
window.location.assign($contentLink.get(0).href);
return;
}
if (!mobileQuery.matches || !$item.length ||
$target.closest('.esun-megamenu-wrapper').length) {
return;
}
$linkedToggle = $target.closest('.esun-megamenu-toggle');
if ($item.hasClass('esun-linked-megamenu-trigger') && !$linkedToggle.length) {
return;
}
$trigger = $linkedToggle.length
? $linkedToggle
: $item.find('> .level-top');
if (!$trigger.length) {
return;
}
event.preventDefault();
event.stopImmediatePropagation();
willOpen = !$item.hasClass('is-open');
resetMenus();
if (willOpen) {
$item.addClass('is-open');
$trigger.attr('aria-expanded', 'true');
}
}
$navigation
.find(triggerSelector)
.attr({
'aria-expanded': 'false'
});
$navigation
.find('.esun-megamenu-toggle')
.attr({
'aria-expanded': 'false'
});
$navigation
.find('.esun-megamenu-wrapper')
.on('click.esunMobileMegaMenu', function (event) {
if (mobileQuery.matches) {
event.stopPropagation();
}
});
$(document)
.off('click.esunMobileMegaMenuReset', '[data-action="toggle-nav"]')
.on('click.esunMobileMegaMenuReset', '[data-action="toggle-nav"]', resetMenus);
if (typeof mobileQuery.addEventListener === 'function') {
mobileQuery.addEventListener('change', function (event) {
if (!event.matches) {
resetMenus();
}
});
} else {
mobileQuery.addListener(function (event) {
if (!event.matches) {
resetMenus();
}
});
}
element.addEventListener('click', handleNavigationClick, true);
};
});