У меня многоуровневое выпадающее меню на моем веб-сайте. Когда я нажимаю на главное меню, оно отображает подменю, но когда я нажимаю на это подменю, оно скользит вверх по меню, не отображая меню. Вот код для этого
$('.main-menu ul li a').click(function(e) {
if ($(this).next().hasClass('sub-menu')) {
e.preventDefault();
$('.sub-menu').slideUp();
$('.main-menu ul li a').removeClass('active');
if ($(this).next('.sub-menu').is(':visible')) {
$(this).removeClass('active');
$(this).next('.sub-menu').slideUp();
} else {
$(this).addClass('active');
$(this).next('.sub-menu').slideToggle();
}
}
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "main-menu">
<ul id = "menu-main-menu" class = "menu">
<li class = "menu-item">
<a href = "http://localhost/barcoun/"><span>Home</span></a>
</li>
<li class = "menu-item">
<a href = "http://localhost/barcoun/about-us/"><span>About Us</span></a>
</li>
<li class = "menu-item">
<a href = "http://localhost/barcoun/contact-us/"><span>Contact Us</span></a>
</li>
<li class = "menu-item">
<a href = "#" class = "menu-image-title-after"><span>Enrolments</span></a>
<ul class = "sub-menu" style = "display: none">
<li class = "menu-item">
<a href = "#"><span>Enrolment</span></a>
<ul class = "sub-menu" style = "display: none">
<li class = "menu-item">
<a href = "http://localhost/barcoun/enrollment-details-by-bar-association/"><span>Enrolment Details</span></a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>@Utkanos e.stopPropagation() здесь не сработает.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не уверен, что это то поведение, которое вы ищете, но если вы удалите первую строку кода, которая вызывает slideUp, похоже, все работает нормально.
$('.main-menu ul li a').click(function(e) {
if ($(this).next().hasClass('sub-menu')){
e.preventDefault();
// Remove this line:
//$('.sub-menu').slideUp();
$('.main-menu ul li a').removeClass('active');
if ($(this).next('.sub-menu').is(':visible')) {
$(this).removeClass('active');
$(this).next('.sub-menu').slideUp();
} else {
$(this).addClass('active');
$(this).next('.sub-menu').slideToggle();
}
}
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "main-menu">
<ul id = "menu-main-menu" class = "menu">
<li class = "menu-item"><a href = "http://localhost/barcoun/"><span>Home</span></a></li>
<li class = "menu-item"><a href = "http://localhost/barcoun/about-us/"><span>About Us</span></a></li>
<li class = "menu-item"><a href = "http://localhost/barcoun/contact-us/"><span>Contact Us</span></a></li>
<li class = "menu-item"><a href = "#" class = "menu-image-title-after"><span>Enrolments</span></a>
<ul class = "sub-menu">
<li class = "menu-item"><a href = "#"><span>Enrolment</span></a>
<ul class = "sub-menu">
<li class = "menu-item"><a href = "http://localhost/barcoun/enrollment-details-by-bar-association/" ><span>Enrolment Details</span></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>Просто избавьтесь от этой строки: $('.sub-menu').slideUp();
$('.main-menu ul li a').click(function(e) {
if ($(this).next().hasClass('sub-menu')) {
e.preventDefault();
// $('.sub-menu').slideUp(); // <--- This is the culprit
$('.main-menu ul li a').removeClass('active');
if ($(this).next('.sub-menu').is(':visible')) {
$(this).removeClass('active');
$(this).next('.sub-menu').slideUp();
} else {
$(this).addClass('active');
$(this).next('.sub-menu').slideToggle();
}
}
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "main-menu">
<ul id = "menu-main-menu" class = "menu">
<li class = "menu-item">
<a href = "http://localhost/barcoun/"><span>Home</span></a>
</li>
<li class = "menu-item">
<a href = "http://localhost/barcoun/about-us/"><span>About Us</span></a>
</li>
<li class = "menu-item">
<a href = "http://localhost/barcoun/contact-us/"><span>Contact Us</span></a>
</li>
<li class = "menu-item">
<a href = "#" class = "menu-image-title-after"><span>Enrolments</span></a>
<ul class = "sub-menu" style = "display: none">
<li class = "menu-item">
<a href = "#"><span>Enrolment</span></a>
<ul class = "sub-menu" style = "display: none">
<li class = "menu-item">
<a href = "http://localhost/barcoun/enrollment-details-by-bar-association/"><span>Enrolment Details I</span></a>
</li>
<li class = "menu-item">
<a href = "http://localhost/barcoun/enrollment-details-by-bar-association/"><span>Enrolment Details II</span></a>
</li>
<li class = "menu-item">
<a href = "http://localhost/barcoun/enrollment-details-by-bar-association/"><span>Enrolment Details III</span></a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
На первый взгляд кажется, что вы не предотвращаете распространение события. Это означает, что любой щелчок по внутренним элементам также регистрируется как щелчок по внешним элементам. См.
Event.stopPropagation()