J'ai un div avec id = "content-area", quand un utilisateur clique en dehors de cette div, je voudrais les alerter du fait qu'ils ont cliqué en dehors de celui-ci. Comment utiliser JavaScript pour résoudre ce problème?
<div id = "outer-container"> <div id = "content-area"> Display Conents </div> </div>
Découvrez ce violon et voyez si c'est ce que vous attendez!
document.getElementById('outer-container').onclick = function(e) { if(e.target != document.getElementById('content-area')) { document.getElementById('content-area').innerHTML = 'You clicked outside.'; } else { document.getElementById('content-area').innerHTML = 'Display Contents'; } }
Reliez l'événement onClick à un élément qui se trouve en dehors de votre zone de contenu, par exemple le corps. Ensuite, à l'intérieur de l'événement, vérifiez si la cible est la zone de contenu ou un enfant direct ou indirect de la zone de contenu . Sinon, alerte.
J'ai fait une fonction qui vérifie si c'est un enfant ou non. Il retourne vrai si le parent d'un nœud est le parent recherché. Sinon, il vérifie s'il a effectivement un parent. Sinon, il renvoie faux. S'il a un parent, mais ce n'est pas celui recherché, il vérifie si le parent parent est le parent recherché.
function isChildOf(child, parent) { if (child.parentNode === parent) { return true; } else if (child.parentNode === null) { return false; } else { return isChildOf(child.parentNode, parent); } }
Consultez également l' exemple en direct (zone de contenu = gris)!
J'ai fait une simple et petite bibliothèque js pour faire cela pour vous:
Il enlève l'addEventListener natif, crée un événement outclick et dispose également d'un setter sur le prototype pour .onclic
Utilisation de base
À l'aide d'un outclick, vous pouvez enregistrer des auditeurs d'événements sur des éléments DOM pour détecter si un autre élément qui était cet élément ou un autre élément à l'intérieur a été cliqué. L'utilisation la plus courante est dans les menus.
var menu = document.getElementById('menu') menu.onoutclick = function () { hide(menu) }
Cela peut également être fait en utilisant la méthode addEventListener
var menu = document.getElementById('menu') menu.addEventListener('outclick', function (e) { hide(menu) })
Alternativement, vous pouvez également utiliser l'attribut html outclick pour déclencher un événement. Cela ne gère pas le HTML dynamique, et nous n'avons aucun plan pour ajouter cela, cependant
<div outclick="someFunc()"></div>
S'amuser!
La méthode Node.contains () renvoie une valeur booléenne indiquant si un noeud est un descendant d'un noeud donné ou non
Vous pouvez attraper des événements en utilisant
document.addEventListener("click", clickOutside, false); function clickOutside(e) { const inside = document.getElementById('content-area').contains(e.target); }
N'oubliez pas de retirer l'événement écouté au bon endroit
document.removeEventListener("click", clickOutside, false)
Utilisez document.activeElement
pour voir lequel de vos éléments html est actif.
Voici une référence: document.activeElement in MDN
Utilisez jquery comme son meilleur pour l'accès DOM
$(document).click(function(e){ if($(e.target).is("#content-area") || $(e.target).closest("#content-area").length) alert("inside content area"); else alert("you clicked out side content area"); });
Voici le violon: http://jsfiddle.net/uQAMm/1/
$('#outercontainer:not(#contentarea)').on('click', function(event){df(event)} ); function df(evenement) { var xstart = $('#contentarea').offset().left; var xend = $('#contentarea').offset().left + $('#contentarea').width(); var ystart = $('#contentarea').offset().top; var yend = $('#contentarea').offset().top + $('#contentarea').height(); var xx = evenement.clientX; var yy = evenement.clientY; if ( !( ( xx >= xstart && xx <= xend ) && ( yy >= ystart && yy <= yend )) ) { alert('out'); } }
Mettez ceci dans votre document:
<script> document.onclick = function(e) { if(e.target.id != 'content-area') alert('you clicked outside of content area'); } </script>