Après des recherches, j'ai trouvé trois solutions qui fonctionnent (j'ai oublié les liens des pages pour référence)
Première solution
<script>
//The good thing about this solution is it doesn't stop event propagation.
var clickFlag = 0;
$('body').on('click', function () {
if(clickFlag == 0) {
console.log('hide element here');
/* Hide element here */
}
else {
clickFlag=0;
}
});
$('body').on('click','#testDiv', function (event) {
clickFlag = 1;
console.log('showed the element');
/* Show the element */
});
</script>
Deuxième solution
<script>
$('body').on('click', function(e) {
if($(e.target).closest('#testDiv').length == 0) {
/* Hide dropdown here */
}
});
</script>
Troisième solution
<script>
var specifiedElement = document.getElementById('testDiv');
document.addEventListener('click', function(event) {
var isClickInside = specifiedElement.contains(event.target);
if (isClickInside) {
console.log('You clicked inside')
}
else {
console.log('You clicked outside')
}
});
</script>
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.