Je souhaite désactiver les clics sur certains éléments dans un div parent avec jQuery. Comment faire?
Mon approche consistait à essayer de l'exclure de la sélection:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrap1">
<div class="wrap2">
<p>Some text</p>
<ul>
<li>list 1</li>
<li>list 2</li>
<li>list 3</li>
</ul>
</div>
<div class="wrap3">
<ul>
<li>Should not be clickable</li>
</ul>
</div>
</div>
$('.wrap1 :not(.wrap3 li)').on("click", function() {
alert(1);
})
Le résultat que je recherche est le suivant: si je clique à l'intérieur du div wrap1 , cela devrait m'inviter à la boîte d'alerte, sauf lorsque je clique à l'intérieur du wrap3 div.
Que me manque-t-il ici?
5 Réponses :
Votre meilleur pari est de vérifier la cible de l'événement.
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrap1">
<div class="wrap2">
<p>Some text</p>
<ul>
<li>list 1</li>
<li>list 2</li>
<li>list 3</li>
</ul>
</div>
<div class="wrap3">
<div style="border: 1px solid red;">
ABC
<div style="background-color:dodgerblue;">
CDE
</div>
</div>
<ul>
<li>Should not be clickable</li>
</ul>
</div>
</div>
$('.wrap1').on("click", function(e){
if(!$(e.target).is(".wrap3, .wrap3 *")){
alert(1);
}
})
$('.wrap1').on("click", function(e){
if(!$(e.target).is(".wrap3, .wrap3 *")){
alert(1);
}
})
Est-il possible de faire cela avec tout le div wrap3 , pas seulement avec l'élément ?
@Radical_Activity J'ai mis à jour ma réponse. Essaye le!
le mot clé function n'est pas nécessaire dans la fonction de flèche
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrap1">
<div class="wrap2">
<p>Some text</p>
<ul>
<li>list 1</li>
<li>list 2</li>
<li>list 3</li>
</ul>
</div>
<div class="wrap3">
<ul>
<li>Should not be clickable</li>
</ul>
</div>
</div>
$('.wrap1 :not(.wrap3 li)').on("click", e => {
e.stopPropagation();
alert(1);
})
Cela me demande toujours l'alerte lorsque je clique sur le
Je ne savais pas que c'était ce que tu voulais mais j'ai fini
Je ne sais pas pourquoi votre méthode ne fonctionne pas, mais cela fonctionne:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrap1">
<div class="wrap2">
<p>Some text</p>
<ul>
<li>list 1</li>
<li>list 2</li>
<li>list 3</li>
</ul>
</div>
<div class="wrap3">
<ul>
<li>Should not be clickable</li>
</ul>
</div>
</div>
$('.wrap1 li').not('.wrap3 li').on("click", (e) => {
e.stopPropagation();
alert(1);
})
Ce qui est étrange, c'est que cela ne me donne l'alerte que lorsque je clique sur la liste 1,2,3 textes, mais pas quand je clique sur some-text ou sur la zone vide à côté de la liste. Pourquoi donc?
Utilisez event.stopPropagation()
<script>
$('.wrap1').on("click", function(){
alert(1);
});
$(".wrap3").on("click", function(event){
// This will stop propagation of the event to parent element.
event.stopPropagation();
});
</script>
Cela devrait le faire!
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrap1">
<div class="wrap2">
<p>Some text</p>
<ul>
<li>list 1</li>
<li>list 2</li>
<li>list 3</li>
</ul>
</div>
<div class="wrap3">
<ul>
<li>Should not be clickable</li>
</ul>
</div>
</div>
$('.wrap1').on("click", function(e) {
if( $(e.target).is('.wrap3 li') ) { return false; }
alert(1);
})