L'événement a une propriété appelée event.path de l'élément qui est un "liste statique ordonnée de tous ses ancêtres dans l'ordre de l'arbre". . Pour vérifier si un événement provient d'un élément DOM spécifique ou de l'un de ses enfants, il suffit de vérifier le chemin de cet élément DOM spécifique. Il peut également être utilisé pour vérifier plusieurs éléments en contrôlant logiquement OR
le contrôle de l'élément dans le some
fonction.
$("body").click(function() {
target = document.getElementById("main");
flag = event.path.some(function(el, i, arr) {
return (el == target)
})
if (flag) {
console.log("Inside")
} else {
console.log("Outside")
}
});
#main {
display: inline-block;
background:yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main">
<ul>
<li>Test-Main</li>
<li>Test-Main</li>
<li>Test-Main</li>
<li>Test-Main</li>
<li>Test-Main</li>
</ul>
</div>
<div id="main2">
Outside Main
</div>
Donc, dans votre cas, ce devrait être
$("body").click(function() {
target = $("#menuscontainer")[0];
flag = event.path.some(function(el, i, arr) {
return (el == target)
});
if (!flag) {
// Hide the menus
}
});
47 votes
Voici un exemple de cette stratégie : jsfiddle.net/tedp/aL7Xe/1
21 votes
Comme Tom l'a mentionné, vous voudrez lire css-tricks.com/dangers-stopping-event-propagation avant d'utiliser cette approche. L'outil jsfiddle est cependant assez cool.
3 votes
Obtenir une référence à l'élément puis à event.target, et enfin != ou == les deux, puis exécuter le code en conséquence
0 votes
Essayez d'utiliser
event.path
. http://stackoverflow.com/questions/152975/how-do-i-detect-a-click-outside-an-element/43405204#434052046 votes
Solution Vanilla JS avec
event.target
et sansevent.stopPropagation
.0 votes
Puisque cela n'est pas mentionné partout dans les réponses mais il m'est utile dans ce contexte : lorsque la souris sort de la fenêtre,
event.relatedTarget
estnull
dans lemouseout
et c'est l'élément sur lequel la souris se trouve maintenant, sinon.