Как определить клик вне элемента с помощью jQuery
Вы можете использовать свойство event.target
для обнаружения щелчка вне элемента, например раскрывающегося меню. Это свойство возвращает элемент DOM, инициировавший событие.
Чтобы проиллюстрировать, как это работает, мы создали раскрывающееся меню в следующем примере, которое будет скрывать и показывать вам подсказку, когда вы щелкаете за пределами области меню с помощью jQuery.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery Detect Click Outside an Element</title>
<style>
body{
font: 15px Arial, sans-serif;
}
ul{
padding: 0;
list-style: none;
background: #f2f2f2;
border: 1px solid #dedede;
}
ul li{
display: inline-block;
position: relative;
line-height: 21px;
}
ul li a{
display: block;
padding: 8px 25px;
color: #333;
text-decoration: none;
}
ul li a:hover{
color: #fff;
background: #939393;
}
ul.dropdown-menu{
min-width: 100%; /* Устанавливаем ширину раскрывающегося списка */ background: #f2f2f2;
display: none;
position: absolute;
z-index: 999;
left: 0;
}
ul.dropdown-menu li{
display: block;
white-space: nowrap;
}
p.hint{
height: 25px;
}
</style>
<script src="//code.jquery.com/jquery-3.5.1.min.js"></script>
<script>$(document).ready(function(){ // Переключение раскрывающегося меню при нажатии элемента триггера $(".dropdown-toggle").click(function(){ // Скрываем другие раскрывающиеся меню в случае нескольких раскрывающихся списков $(".dropdown-menu").not($(this).next()).slideUp("fast"); // Переключаем текущее раскрывающееся меню $(this).next(".dropdown-menu").slideToggle("fast"); // Отображение подсказки $(".hint").html("A click <b>inside</b> the dropdown is detected."); }); // Скрываем раскрывающееся меню при нажатии снаружи $(document).on("click", function(event){ if(!$(event.target).closest(".dropdown").length){ $(".dropdown-menu").slideUp("fast"); // Отображение подсказки $(".hint").html("A click <b>outside</b> the dropdown is detected."); } });
});
</script>
</head><body> <p class="hint"><!-- Здесь будет вставлен текст подсказки --></p> <ul> <li><a href="#">Home</a></li> <li><a href="#">About</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle">Services ▾</a> <ul class="dropdown-menu"> <li><a href="#">Web Design</a></li> <li><a href="#">Web Development</a></li> <li><a href="#">Graphic Design</a></li> </ul> </li> <li><a href="#">Contact</a></li> </ul></body></html>
Вам следует избегать использования метода stopPropagation()
в таких ситуациях, поскольку он нарушает нормальный поток событий в дереве DOM. Это также считается плохой практикой.
Подробнее см. Руководство по распространению событий JavaScript, чтобы узнать, как события распространяются в дереве DOM.