Solution1
Au lieu d'utiliser event.stopPropagation() qui peut avoir des effets secondaires, il suffit de définir une simple variable drapeau et d'ajouter un if
condition. J'ai testé cela et cela a fonctionné correctement sans aucun effet secondaire de stopPropagation :
var flag = "1";
$('#menucontainer').click(function(event){
flag = "0"; // flag 0 means click happened in the area where we should not do any action
});
$('html').click(function() {
if(flag != "0"){
// Hide the menus if visible
}
else {
flag = "1";
}
});
Solution2
Avec un simple if
condition :
$(document).on('click', function(event){
var container = $("#menucontainer");
if (!container.is(event.target) && // If the target of the click isn't the container...
container.has(event.target).length === 0) // ... nor a descendant of the container
{
// Do whatever you want to do when click is outside the element
}
});
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.