J'utilise actuellement jQuery pour rendre un div cliquable et dans ce div, j'ai également des ancres. Le problème que je rencontre est que lorsque je clique sur une ancre, les deux événements de clic se déclenchent (pour la div et l'ancre). Comment puis-je empêcher l'événement onclick de la division de se déclencher lorsqu'un clic sur une ancre est activé?
Voici le code cassé:
Javascript
var url = $("#clickable a").attr("href");
$("#clickable").click(function() {
window.location = url;
return true;
})
HTML
<div id="clickable">
<!-- Other content. -->
<a href="http://foo.com">I don't want #clickable to handle this click event.</a>
</div>
la source
if( e.target !== this) return;
chez le parent est meilleure quee.stopPropagation()
chez l'enfant car vous ne savez jamais si quelqu'un d'autre attache un gestionnaire aux enfants, ou si une bibliothèque doit attacher un gestionnaire à un enfant (et vous ne voulez pas jouer avec le code de la bibliothèque). C'est une meilleure séparation des préoccupations.if( e.target !== this) return;
coche dans le parent signifie que si l'un des autres enfants de ce parent qui n'ont pas de gestionnaire onClick est cliqué, rien ne se passe. Il est donc inutile pour une situation où vous avez par exemple un parent div cliquable.e.stopPropagation()
fonctionne bien cependant.Utilisez la méthode stopPropagation , voir un exemple:
Comme l'a dit jQuery Docs:
Gardez à l'esprit que cela n'empêche pas les autres écouteurs de gérer cet événement (par exemple, plus d'un gestionnaire de clic pour un bouton), si ce n'est pas l'effet souhaité, vous devez utiliser à la
stopImmediatePropagation
place.la source
Voici ma solution pour tous ceux qui recherchent un code non jQuery (javascript pur)
Votre code ne sera pas exécuté si vous cliquez sur les enfants des parents
la source
window.event
ce que MDN décourage: developer.mozilla.org/en-US/docs/Web/API/Window/event . Si vous pouvez gagner du temps, je vous serais reconnaissant de bien vouloir expliquer pourquoi vous l'avez utiliséwindow.event
(c'est peut-être un problème qui existait en 2015 ou je n'ai pas compris la raison).vous pouvez également essayer ceci
la source
Si vous n'avez pas l'intention d'interagir avec les éléments internes dans tous les cas, une solution CSS peut vous être utile.
Réglez simplement le ou les éléments intérieurs sur
pointer-events: none
dans ton cas:
ou pour cibler tous les éléments internes en général:
Ce hack facile m'a fait gagner beaucoup de temps lors du développement avec ReactJS
Le support du navigateur peut être trouvé ici: http://caniuse.com/#feat=pointer-events
la source
Si vous avez plusieurs éléments dans le div cliquable, vous devez le faire:
la source
L'utilisation de
return false;
oue.stopPropogation();
ne permettra pas l'exécution de code supplémentaire. Il arrêtera le flux à ce point lui-même.la source
Écrire si quelqu'un a besoin (a travaillé pour moi):
De cette solution.
la source
Alternative en ligne:
la source
Voici un exemple d'utilisation d'Angular 2+
Par exemple, si vous souhaitez fermer un composant modal si l'utilisateur clique en dehors de celui-ci:
la source
Vous devez empêcher l'événement d'atteindre (se propager) au parent (le div). Voir la partie sur le bullage ici et les informations API spécifiques à jQuery ici .
la source
la source
Pour spécifier un sous-élément comme non cliquable, écrivez la hiérarchie css comme dans l'exemple ci-dessous.
Dans cet exemple, j'arrête la propagation vers tous les éléments (*) à l'intérieur de td à l'intérieur de tr à l'intérieur d'une table avec la classe ".subtable"
la source
ignoreParent () est une solution JavaScript pure.
Il fonctionne comme une couche intermédiaire qui compare les coordonnées du clic de la souris avec les coordonnées des éléments enfants. Deux étapes d'implémentation simples:
1. Mettez le code ignoreParent () sur votre page.
2. Au lieu de l'original onclick = "parentEvent ();" du parent , écrire:
Vous pouvez transmettre des ID de n'importe quel nombre d'éléments enfants à la fonction et en exclure d'autres.
Si vous avez cliqué sur l'un des éléments enfants, l'événement parent ne se déclenche pas. Si vous avez cliqué sur parent, mais sur aucun des éléments enfants [fournis comme arguments], l'événement parent est déclenché.
Code ignoreParent () sur Github
la source
S'il est dans un contexte en ligne, en HTML, essayez ceci:
la source
Au cas où quelqu'un aurait eu ce problème en utilisant React, voici comment je l'ai résolu.
scss:
Rendu du composant ():
En ajoutant une fonction onClick pour le modal enfant (content div), les événements de clic de souris sont empêchés d'atteindre la fonction 'closeLogin' de l'élément parent.
Cela a fait l'affaire pour moi et j'ai pu créer un effet modal avec 2 divs simples.
la source
ajouter
a
comme suit:ou à
return false;
partir du gestionnaire de clic pour#clickable
comme:la source
Toutes les solutions sont compliquées et de jscript. Voici la version la plus simple:
la source
la source