283 votes

Comment faire en sorte que l'événement de clic se déclenche UNIQUEMENT sur le DIV parent, et non sur les enfants ?

J'ai un DIV avec une classe foobar et quelques DIVs à l'intérieur de ce DIV qui ne sont pas classés, mais je suppose qu'ils héritent de la classe foobar classe :

$('.foobar').on('click', function() { /*...do stuff...*/ });

Je veux que cela ne se déclenche que lorsque l'on clique quelque part dans le DIV mais pas sur ses DIVs enfants.

521voto

squint Points 28293

Si le e.target est le même élément que this vous n'avez pas cliqué sur un descendant.

$('.foobar').on('click', function(e) {
  if (e.target !== this)
    return;

  alert( 'clicked the foobar' );
});

.foobar {
  padding: 20px; background: yellow;
}
span {
  background: blue; color: white; padding: 8px;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class='foobar'> .foobar (alert) 
  <span>child (no alert)</span>
</div>

0 votes

Cette réponse explique ce commentaire

0 votes

@gdoron : Adam est trop gentil. :)

0 votes

Pouvez-vous s'il vous plaît répondre à mon question ... =)

124voto

Jens Törnell Points 1797

Je n'ai pas réussi à faire fonctionner la réponse acceptée, mais ceci semble faire l'affaire, au moins dans vanilla JS.

if(e.target !== e.currentTarget) return;

111voto

hobberwickey Points 1393

Il existe un autre moyen qui fonctionne si cela ne vous dérange pas de ne cibler que les navigateurs les plus récents. Il suffit d'ajouter le fichier CSS

pointer-events: none;

à tous les enfants de la division que vous voulez capturer le clic. Voici les tableaux de support

http://caniuse.com/#feat=pointer-events

37voto

ori Points 5285

Vous pouvez utiliser le bouillonnement en votre faveur :

$('.foobar').on('click', function(e) {
    // do your thing.
}).on('click', 'div', function(e) {
    // clicked on descendant div
    e.stopPropagation();
});

0 votes

Cela semble être une bonne solution pour mon scénario spécifique, car je veux seulement exclure les clics sur les descendants. <a> éléments. Il y a juste un problème : lorsque je clique au milieu de l'élément, l'événement se déclenche quand même (testé dans Google Chrome). Existe-t-il une variante qui empêche également ce phénomène ?

0 votes

@cgogolin, jetez un oeil à ça : stackoverflow.com/questions/12197122/

23voto

Jasper Points 54859
//bind `click` event handler to the `.foobar` element(s) to do work,
//then find the children of all the `.foobar` element(s)
//and bind a `click` event handler to them that stops the propagation of the event
$('.foobar').on('click', function () { ... }).children().on('click', function (event) {
    event.stopPropagation();
    //you can also use `return false;` which is the same as `event.preventDefault()` and `event.stopPropagation()` all in one (in a jQuery event handler)
});

Cela arrêtera la propagation (bouillonnement) de la click sur l'un des éléments enfants de l'élément .foobar afin que l'événement n'atteigne pas l'élément .foobar pour déclencher leur(s) gestionnaire(s) d'événements.

Voici une démo : http://jsfiddle.net/bQQJP/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X