Почему DOM автоматически удаляет мои классы при изменении страницы?

У меня есть специально написанный аккордеон для моего «сиденава», это очень просто, просто добавляю класс при событии клика для запуска и сворачивания элементов меню, но проблема в том, что когда я нажимаю на ссылку в свернутом состоянии <li>, страница начинается с перенаправить; все классы, которые я добавил с помощью обработчика кликов javascript, - это автоматически удален, и это выглядит очень уродливо:

Почему DOM автоматически удаляет мои классы при изменении страницы?

... и как я могу это исправить? Это мой javascript (jquery) и html-код:

$('.mine-trigger').click(function(){

        var 
        control_click       = $(this).hasClass('mine-trigger-open'),
        howmuchchildrens    = $(this).children('.mine-content').children('.mine-content__link').length,
        calcPixels          = (howmuchchildrens * 48) + 'px';

        if (control_click == false){
            $(this).addClass('mine-trigger-open');
            $(this).children('.mine-content').css('max-height', calcPixels);
        }
        if (control_click == true) {
            $(this).removeClass('mine-trigger-open');
            $(this).children('.mine-content').css('max-height', 0);
        }
    });
        <li class = "mine-trigger">
            <a class = "sidenav__link">
                <span class = "sidenav__icon ico-person"></span>
                Cariler
            </a>
            <div class = "mine-content">
                <a class = "sidenav__link mine-content__link" href='<?php echo site_url('yonetim/cari')?>'>
                    <span class = "sidenav__icon ico-person"></span>
                    Cari
                </a>    
                <a class = "sidenav__link mine-content__link" href='<?php echo site_url('yonetim/personel')?>'>
                    <span class = "sidenav__icon ico-assignment_ind"></span>
                    Personel
                </a>    
            </div>
        </li>

и извините за мой плохой английский :(

Muhammed 13.06.2019 01:19

Похоже, вы хотите перехватывать события кликов в пунктах меню и предотвращать их распространение на ваши элементы аккордеона.

Phil 13.06.2019 01:27

Какой у вас HTML?

user241244 13.06.2019 01:40

@D_N Я добавил...

Muhammed 13.06.2019 01:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
297
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проще говоря, страница неавтоматически удаляет классы, которые вы применили.

Очевидно, вы намеренно применяете их при нажатии на закрытый элемент, прежде чем удалить их и установить максимальную высоту дочерних элементов на 0.

Вы устанавливаете атрибут max-height для дочерних элементов, но они появляются медленно. Похоже, это указывает на то, что при применении класса «mine-trigger-open» используется переход. Максимальная высота устанавливается мгновенно, но фактическая высота меняется с течением времени.

Однако, когда вы идете другим путем, вы мгновенно устанавливаете атрибут max-height в 0. Даже если происходит переход по атрибуту высоты, вы не увидите элементы, поскольку они были скрыты. Вместо того, чтобы применять атрибут max-height на этом этапе, я бы предложил, чтобы он появился в правиле, управляющем переходом, когда «mine-trigger-open» добавляется или удаляется.

Ответ принят как подходящий

Событие запускается из LI, поэтому «это» всегда будет .mine-trigger, и щелчок по любому дочернему элементу закроет. проверьте event.target, чтобы определить, был ли щелчок внутри навигационной ссылки, чтобы определить, следует ли закрыть аккордеон.

$('.mine-trigger').click(function(e){
    var is_open = $(this).hasClass('mine-trigger-open');
    var from_link = is_open && $(e.target).closest('.mine-content__link').length == 1;

    if (!is_open) {
        // open accordion    
    } else if (is_open && !from_link) {
        // close accordion
    }

Вы также можете получить/установить значение cookie или localStorage, чтобы повторно открыть аккордеон на странице, на которую вы переходите.

Другие вопросы по теме