Détecter cliquez à l'extérieur de l'élément (vanille JavaScript)
J'ai cherché pendant une bonne solution partout, mais je ne peux pas en trouver un qui ne pas utiliser jQuery.
Est-il de la croix-navigateur, de façon normale (sans bizarre hacks ou faciles à casser le code), pour détecter un clic à l'extérieur d'un élément (qui peut ou peut ne pas avoir d'enfants)?
- Serait configuration d'un gestionnaire d'événement onclick sur le corps de la balise de faire le travail?
Vous devez vous connecter pour publier un commentaire.
Ajouter un écouteur d'événement à
document
et l'utilisationNœud.contains()
à trouver si la cible de l'événement (qui est à l'intérieur de la plupart des cliqué sur l'élément) est à l'intérieur de votre élément spécifié. Il fonctionne même dans IE5JS:
CSS:
HTML:
Vous avez besoin pour gérer l'événement de clic sur le document de niveau. Dans le cas de l'objet, vous avez un
target
de la propriété, le plus intérieur de l'élément DOM qui a été cliqué. Ceci vous permet de vérifier lui-même et marcher jusqu'à ses parents jusqu'à ce que l'élément de document, si l'un d'eux est regardé votre élément.Voir l'exemple sur jsFiddle
Comme toujours, ce n'est pas de la croix-bad-navigateur compatible en raison de la méthode addEventListener/attachEvent, mais il fonctionne comme ceci.
Un enfant est cliqué, lorsqu'il n'est pas de l'événement.cible, mais l'un de ses parents est le regardé élément (je suis un simple comptage pour cette). Vous pouvez également avoir un booléen var, si l'élément est présent ou pas, de ne pas retourner au gestionnaire de l'intérieur pour la clause. Mon exemple est un facteur limitant pour que le gestionnaire seulement finitions, quand rien ne correspond.
L'ajout de croix-navigateur de compatibilité, j'ai l'habitude de le faire comme ceci:
C'est cross-browser compatible code pour attacher un écouteur d'événement/gestionnaire, inclusive réécriture
this
dans IE, à l'élément, comme le fait jQuery pour ses gestionnaires d'événements. Il y a beaucoup d'arguments ont certains bits de jQuery à l'esprit 😉target
propriété (qui, comme metadings dit, sera le plus intérieur de l'élément DOM) - et tous ses éléments parents. Soit vous atteindre vos regardé élément, ce qui signifie que l'utilisateur a cliqué à l'intérieur, ou que vous arrivez à l'élément de document, dans lequel cas, il/elle a cliqué sur l'extérieur. Alternativement, vous pouvez ajouter deux sur les auditeurs - l'un sur l'élément de document, et de l'autre sur le regardé-élément, qui utiliseevent.stopPropagation()
/cancelBubble
, afin que l'auditeur sur l'élément de document est uniquement déclenché par un clic à l'extérieur de l'regardé élément.for
. Par curiosité, y aurait-il quelque raison de ne pas comparer un élément à partir d'une variable avec la cible sur l'événement (à l'aide d'une comparaison stricte)?Comment à ce sujet:
jsBin démo
Pour masquer l'élément de cliquer en dehors de ça j'ai l'habitude d'appliquer de telles code simple:
JS: