Выделение активного пункта меню

144
08 марта 2022, 00:40

Имеется следующий код меню:

 <ul class="second-nav">
        <li class="second-nav__item">
            <a href="/catalog/new/" class="second-nav__link">Новинки</a>
            <div class="second-nav__sub-menu">
                <ul class="second-nav__sub-list">
                    <li class="second-nav__item-sub-menu"><a href="/catalog/new_trousers/"
                            class="second-nav__sub-link">Брюки</a></li>
                    <li class="second-nav__item-sub-menu"><a href="/catalog/new_jumpers/"
                            class="second-nav__sub-link">Джемпера</a></li>
                    <li class="second-nav__item-sub-menu"><a href="/catalog/new_costumes/"
                            class="second-nav__sub-link">Костюмы</a></li>
                </ul>
            </div>
        </li>
        <li class="second-nav__item">
            <a href="/catalog/sale/" class="second-nav__link second-nav__link--active">Распродажа</a>
            <div class="second-nav__sub-menu">
                <ul class="second-nav__sub-list">
                    <li class="second-nav__item-sub-menu"><a href="/catalog/sale_blouses/"
                            class="second-nav__sub-link">Блузки</a></li>
                    <li class="second-nav__item-sub-menu"><a href="/catalog/sale_breeches/"
                            class="second-nav__sub-link">Бриджи</a></li>
                </ul>
            </div>
        </li>
    </ul>

Мне нужно чтобы при переходе, например по ссылке "Брюки" ссылка меню, в котором находится ссылка, по которой мы перешли (а данном случае "Новинки") оставался активным. При переходе, например по ссылке "Бриджи" активным должна оставаться соответственно ссылка "Распродажа".

Вот js код:

$(function () {
    let fullUrl = window.location.href;
    let urlContent = fullUrl.split('/')
    let shortUrl = '/catalog/' + urlContent[urlContent.length - 2] + '/';
    $('.second-nav li').each(function () {
        let link = $(this).find('a').attr('href');
        if(shortUrl == link) {
        let currentItem = $(this)[0].parentElement.parentElement.parentElement;    
        currentItem.firstElementChild.classList.add('second-nav__link--active');
        }
    });
    $('.second-nav__link').each(function () {
        if(shortUrl == $(this).attr('href')) {
            $(this)[0].classList.add('second-nav__link--active');
        }
    });
});

В принципе всё работает нормально, но очень смущает вот эта конструкция:

let currentItem = $(this)[0].parentElement.parentElement.parentElement;

Подскажите пожалуйста правильно ли вот так обращаться элементу? Если неправильно, то может кто-нибудь подскажет более правильный вариант решения данной задачи. Заранее благодарен.

Answer 1

Во-первых, тогда уж не

$(this)[0].parentElement.parentElement.parentElement;

a

this.parentElement.parentElement.parentElement;

Во-вторых, jQuery вполне способна с этим справиться:

$(this).closest('.second-nav__item');
READ ALSO
Фильтр по чекбоксам

Фильтр по чекбоксам

Я пытаюсь отсортировать данные с джсона по чекбоксамПример данных:

149
Вывести случайное кол-во div из списка

Вывести случайное кол-во div из списка

В файле есть n количество div с классом item-1, item-2,

92
Разница между методами arr.map() и arr.filter()

Разница между методами arr.map() и arr.filter()

Поясните разницу между выводом одного и того же кода методами arrfilter() и arr

247