Вы можете использовать свойство 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="https://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.