Приветствую.
Изучите как работают события в DOM. Это очень полезно. Trust me. Они погружаются до элемента и потом всплывают. Вот хорошие примеры -
learn.javascript.ru/event-bubbling
Вкратце, когда вы кликаете на DOM-ноду,
1. событие начинает свой путь от самого корневого элемента, от
document
,
2. доходит до кликнутого элемента, запускает обработчики если они есть на этом элементе
3. начинает всплывать, запуская обработчики на каждом элементе у которого есть обработчики на такой тип события, в данном примере
click
Всплытие можно остановить и это как раз то, что вам нужно
<div class="parent">
<div class="son">son</div>
<div class="son1">son 1</div>
<div class="son2">son 2</div>
</div>
$('.parent').on('click', function() {
console.log('parent function');
});
$('.son').on('click', function(event) {
event.stopPropagation();
console.log('son function');
});
Что в данном случае происходит, событие опускается до
$('.son')
, запускает обработчик
function(event) {...});
, а
event.stopPropagation();
запрещает событию
click
всплыть, то есть подняться до элемента
$('.parent')
, поэтому обработчики
$('.parent')
не запускаются.
Ещё бы хотел посоветовать меньше лезть/смотреть в DOM. Говорят это очень ресурсоемкие задачи, так родился Virtual DOM.
Что в вашем примере не так.
Вы сначала лезете в DOM за
$('.parent')
, а потом за
$('.son')
.
Сохраняя
$('.parent')
, вы уже можете обратится к
$('.son')
без лазания в DOM.
То есть ваш пример выгоднее бы выглядел вот так
const $parent = $('.parent');
const $son = $parent.find('.son');
$parent.on('click', function() {
console.log('parent function');
});
$son.on('click', function(event) {
event.stopPropagation();
console.log('son function');
});
Я понимаю, что в данном примере это вообще никак не отразится на производительности, но если ваше приложение чуть сложнее, чем этот пример, то профиты будут.