#javascript #html
#javascript #HTML
Вопрос:
Я назначаю активный класс в своем меню, но активный класс не удаляется из мобильного меню, он всегда остается активным. А также, если выбрана подкатегория, я хочу, чтобы у самой категории был активный класс. Я пытался, но не смог. Заранее благодарим друзей, которые помогли.
Например, если category1.php страница открыта, «категория» имеет деактивированный класс.
function updateMenu(url) {
const active = document.querySelector('.menu-item.active');
if (active !== null) {
active.classList.remove('active');
}
const links = Array.from(document.querySelectorAll('.menu-item'));
links.forEach(function(li){
let anchor = li.querySelector("a");
if(url.indexOf(anchor.href) > -1){
li.classList.add("active");
}
});
}
updateMenu(window.location.href);
<div class="header_side_container">
<div class="header_builder_component">
<nav class="main-menu">
<ul id="menu-main-menu" class="menu">
<li class="menu-item">
<a href="home.php"><span>Home</span></a>
</li>
<li class="menu-item">
<a href="#"><span>category</span></a>
<ul class="sub-menu">
<li class="menu-item">
<a href="Category1.php">
<span>Category 1</span>
</a>
</li>
<li class="menu-item">
<a href="Category2.php">
<span>Category 2</span>
</a>
</li>
</ul>
</li>
<li class="menu-item">
<a href="gallery.php"><span>gallery</span></a>
</li>
<li class="menu-item">
<a href="about.php"><span>about</span></a>
</li>
<li class="menu-item">
<a href="contact.php"><span>contact</span></a>
</li>
</nav>
</div>
</div>
<!--Mobil-->
<nav class="mobile_menu">
<ul id="menu-top_menu-1">
<li class="menu-item">
<a href="home.php"><span>Home</span></a>
</li>
<li class="menu-item">
<a href="#"><span>category</span></a>
<ul class="sub-menu">
<li class="menu-item">
<a href="Category1.php">
<span>Category 1</span>
</a>
</li>
<li class="menu-item">
<a href="Category2.php">
<span>Category 2</span>
</a>
</li>
</ul>
</li>
<li class="menu-item">
<a href="gallery.php"><span>gallery</span></a>
</li>
<li class="menu-item">
<a href="about.php"><span>about</span></a>
</li>
<li class="menu-item">
<a href="contact.php"><span>contact</span></a>
</li>
</ul>
</nav>
Ответ №1:
окно.Расположение.pathname — это нужное вам свойство. Как только у вас это получится, вы можете найти имя файла (последнюю часть полного пути) с помощью .substr
и .lastIndexOf
.
В этом фрагменте кода активный элемент является родительским для JS
, я использовал это в качестве примера, так как location.href
для этих SO-фрагментов являетсяhttps://stacksnippets.net/js , следовательно, путь — /js, и, наконец, имя файла — js.
Проверьте код, и вы поймете, что я имею в виду
ПРИВЕТ
function updateMenu(url) {
const active = document.querySelector('.menu-item.active');
if (active !== null) {
active.classList.remove('active');
}
const links = Array.from(document.querySelectorAll('.menu-item'));
links.forEach(function(li){
let anchor = li.querySelector("a");
if(anchor.href.indexOf(url) > -1) {
const parentLI = $(li).parents('.menu-item').get(0)
if(parentLI)
parentLI.classList.add("active");
else
li.classList.add("active");
}
});
}
const pathname = window.location.pathname, filename=pathname.substr(pathname.lastIndexOf('/') 1);
updateMenu(filename);
li.active > a span{
font-weight: bold !important;
color: red
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="header_side_container">
<div class="header_builder_component">
<nav class="main-menu">
<ul id="menu-main-menu" class="menu">
<li class="menu-item">
<a href="home.php"><span>Home</span></a>
</li>
<li class="menu-item">
<a href="#"><span>category</span></a>
<ul class="sub-menu">
<li class="menu-item">
<a href="Category1.php">
<span>Category 1</span>
</a>
</li>
<li class="menu-item">
<a href="js">
<span>JS</span>
</a>
</li>
<li class="menu-item">
<a href="Category2.php">
<span>Category 2</span>
</a>
</li>
</ul>
</li>
<li class="menu-item">
<a href="gallery.php"><span>gallery</span></a>
</li>
<li class="menu-item">
<a href="about.php"><span>about</span></a>
</li>
<li class="menu-item">
<a href="contact.php"><span>contact</span></a>
</li>
</ul>
</nav>
</div>
</div>
<!--Mobil-->
<nav class="mobile_menu">
<ul id="menu-top_menu-1">
<li class="menu-item">
<a href="home.php"><span>Home</span></a>
</li>
<li class="menu-item">
<a href="#"><span>category</span></a>
<ul class="sub-menu">
<li class="menu-item">
<a href="Category1.php">
<span>Category 1</span>
</a>
</li>
<li class="menu-item">
<a href="js">
<span>JS too</span>
</a>
</li>
<li class="menu-item">
<a href="Category2.php">
<span>Category 2</span>
</a>
</li>
</ul>
</li>
<li class="menu-item">
<a href="gallery.php"><span>gallery</span></a>
</li>
<li class="menu-item">
<a href="about.php"><span>about</span></a>
</li>
<li class="menu-item">
<a href="contact.php"><span>contact</span></a>
</li>
</ul>
</nav>
Комментарии:
1. Спасибо за ваш ответ, но активный класс не удаляется. Активный остается во всех классах li.
2. @MesutBla
active
класс не обязательно удалять из любого элемента списка (я не удалял это первымif
, потому что я не хотел слишком сильно изменять вашу функцию, но это вообще не нужно), вам это нужно толькоif
в случае, если вы создаете SPA, что, я думаю, не так. если это традиционный поток перезагрузки при каждом запросе, тоactive
класс теряется при каждой перезагрузке. вам нужно только установить его обратно на правильный пункт в меню, и этого вы можете достичь с помощьюwindow.location.pathname
prop. такое поведение сложно эмулировать во фрагменте SO, потому что сервер не работает с