#javascript #css #flask #dom #rendering
#javascript #css #flask #dom #рендеринг
Вопрос:
Я создаю веб-приложение с помощью Flask и пытаюсь создать небольшое выпадающее меню для выхода пользователя из системы. Я добавил прослушиватель событий в панель навигации (мобильную или настольную), и код работает так же хорошо, как отражено на консоли (я регистрирую элемент и цель на консоли, как вы можете видеть), но это изменение не отражается на DOM. Если я добавлю класс вручную в DOM, он это сделает. Я пытался добавить прослушиватель событий и к другим элементам, но, похоже, ничего не работает. Я также пытался использовать другие механизмы CSS для изменения специфики, но результат тот же. Я упоминал, что использую Flask на случай, если Jinja что-то напутает с этим, поскольку это основной HTML-макет, от которого наследуется каждый шаблон. Заранее спасибо
<nav class="mobile-user">
<div class="user-menu">
<img class="profile-img" src="../static/assets/user.png" alt="user's photo">
<div id="logout" class="logout">
<ul>
<li><a href="{{ url_for('account') }}">Profile</a></li>
<li><a href="{{ url_for('logout') }}">Logout</a></li>
</ul>
</div>
</div>
</nav>
//...irrelevant html between these two
<nav class="desktop-nav">
<div class="nav-container">
<div class="logo">
<a href="{{ url_for('index') }}"><h2>queerevent</h2></a>
</div>
{% if not current_user.is_anonymous %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/favorites">Favorites</a></li>
<li><a href="/my-events">My Events</a></li>
<li><a href="/calendar">Calendar</a></li>
<li><a href="/new">New Event</a></li>
<li class="user-menu">
<img class="profile-img" id="user-img" src="../static/assets/user.png" alt="user's image">
<div id="logout" class="logout">
<ul>
<li><a href="{{ url_for('account') }}">Profile</a></li>
<li><a href="{{ url_for('logout') }}">Logout</a></li>
</ul>
</div>
</li>
</ul>
{% else %}
<ul>
<li><a href="{{ url_for('login') }}">Sign In</a></li>
</ul>
{% endif %}
</div>
</nav>
#logout {
position: relative;
top: 1rem;
right: 1.5rem;
padding: .5rem;
width: auto;
height: auto;
background-color: #fff;
border: 1px solid black;
border-radius: 5px;
}
.logout {
display: none;
}
.logout.active {
display: inline-block;
}
#logout::before {
content: '▲';
position: absolute;
top: -25%;
left: 50%;
transform: translate(-50%);
}
'use strict'
const menu = document.querySelector('.desktop-nav') || document.querySelector('.mobile-user')
menu.addEventListener('click', (e) => {
const userImage = document.querySelector('#user-img')
const logoutMenu = document.querySelector('.logout');
console.log(e.target)
if (e.target === userImage) {
logoutMenu.classList.toggle('active');
console.log(logoutMenu)
}
})
Комментарии:
1. Я просто хочу знать, почему вы не подключаете прослушиватель кликов к #user-img ?
2. Это было первое, что я сделал, но в этом случае прослушиватель событий даже не будет добавлен. Я открыл консоль, и переменная была там, но прослушиватель событий не был добавлен. Итак, я попробовал с родительским, и это сработало. Событие происходит, и класс переключается, но DOM не меняется
3. Я думаю, вы добавляете событие после завершения загрузки DOM, верно?
4. Да, сценарий находится в конце тела
5. Если вы используете Chrome и после того, как увидите
console.log(logoutMenu)
, вы можете дважды щелкнуть элемент в консоли, вы увидите, что его класс обновлен. Если он был обновлен, вы видитеactive
, но не видите элемент, видимый на экране, вы можете проверить этот элемент, чтобы увидеть, какое свойство CSS неверно.