Если вы не предполагаете, что элементы будут добавлены динамически, не используйте делегирование событий, просто подключите прослушиватель к каждой цели, в этом случае к элементам .side-nav > [data-page]
.
Благодаря этому вы избежите всех проблем обнаружения,например, какой фактический div
был выбран и т. д., где this
будет целевым элементом, например, this.dataset.page
.
... и бонус;меньше кода, меньше ошибок, более простое обслуживание.
Обратите внимание, что вы использовали data.set.param
, должно быть dataset.param
, где param
здесь page
(data-page
)
Фрагмент стека
document.querySelectorAll('.side-nav > [data-page]').forEach(el => {
el.addEventListener('click', function() {
console.log(this.dataset.page);
});
});
<div class="side-nav">
<div class="side-nav-button side-nav-active pointer" id="dashboard-shortcut" title="Home" data-page="dashboard">
<p class="side-nav-button-icon"><i class="fas fa-home">Home</i></p>
</div>
<div class="side-nav-button side-nav-active pointer" id="another-div-shortcut" title="page2" data-page="page2">
<p class="side-nav-button-icon"><i class="fas fa-cross">Page2</i></p>
</div>
</div>
На основании комментария, в котором OP сказал, что они загружают элементы динамически, добавлен второй пример.
Использование if (e.target !== this && this.contains(e.target))
мы можем проверить, чтобы кто-то нажал не на .side.nav
(e.target !== this
), а на одного из его потомков (this.contains(e.target)
), прежде чем продолжить.
И если при e.target.closest('[data-page]').dataset.page
мы получимцелевой элемент.
Обратите внимание, как уже упоминалось в другом комментарии, если вы вложили .side-nav
в дочерние элементы, имеющие одинаковые классы / атрибут, вам может потребоваться настроить, например, расширение селектора для closest()
, до closest('.side-nav > [data-page]')
, должно быть достаточно, однако трудно сказать с уверенностью.
Фрагмент стека
document.querySelector('.side-nav').addEventListener('click', function(e) {
if (e.target !== this && this.contains(e.target)) {
console.log(e.target.closest('[data-page]').dataset.page);
}
});
<div class="side-nav">
<div class="side-nav-button side-nav-active pointer" id="dashboard-shortcut" title="Home" data-page="dashboard">
<p class="side-nav-button-icon"><i class="fas fa-home">Home</i></p>
</div>
<div class="side-nav-button side-nav-active pointer" id="another-div-shortcut" title="page2" data-page="page2">
<p class="side-nav-button-icon"><i class="fas fa-cross">Page2</i></p>
</div>
</div>