I have a stupid problem with jQuery.. I’m trying to make a simple lightbox and I have problems with the “close” button.. Here is what I have – a grid with some color variations. We have an image and a text for the color. When we click on it, we should see the image in a lightbox with bigger size. To do so, I’m just adding and removing a class. The weird thing is that the on click on the close is working, the console log is displayed, but the class is not removed.. Why is that? What do I do wrong here? Shouldn’t the function on the close button remove the class from all elements?
var colorVariation = $('.product-variations__color');
var colorPopUp = $('.product-variations__color-popup');
colorVariation.on('click', function () {
$(this).find(colorPopUp).addClass('is-active');
});
$('.close').on('click', function() {
colorPopUp.removeClass('is-active');
console.log('woohoo');
});.product-variations {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
.product-variations__color {
max-width: calc((100% / 4) - 20px);
padding: 0 10px 50px;
}
.product-variations__color-name {
width: 100%;
text-align: center;
}
.product-variations__color-popup {
display: none;
}
.product-variations__color-popup.is-active {
display: block;
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
}
.product-variations__color-popup.is-active .close {
filter: difference;
position: absolute;
top: 20px;
left: 20px;
cursor: pointer;
}<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="product-variations">
<div class="product-variations__color">
<img src="https://via.placeholder.com/150x150/ff0000" />
<div class="product-variations__color-name">
Red
</div>
<div class="product-variations__color-popup">
<div class="close">×</div>
<img src="https://via.placeholder.com/1500x1500/ff0000" />
</div>
</div>
<div class="product-variations__color">
<img src="https://via.placeholder.com/150x150/008000" />
<div class="product-variations__color-name">
Green
</div>
<div class="product-variations__color-popup">
<div class="close">×</div>
<img src="https://via.placeholder.com/1500x1500/008000" />
</div>
</div>
<div class="product-variations__color">
<img src="https://via.placeholder.com/150x150/0000ff" />
<div class="product-variations__color-name">
Blue
</div>
<div class="product-variations__color-popup">
<div class="close">×</div>
<img src="https://via.placeholder.com/1500x1500/0000ff" />
</div>
</div>
<div class="product-variations__color">
<img src="https://via.placeholder.com/150x150/800080" />
<div class="product-variations__color-name">
Purple
</div>
<div class="product-variations__color-popup">
<div class="close">×</div>
<img src="https://via.placeholder.com/1500x1500/800080" />
</div>
</div>
<div class="product-variations__color">
<img src="https://via.placeholder.com/150x150/FFFF00" />
<div class="product-variations__color-name">
Yellow
</div>
<div class="product-variations__color-popup">
<div class="close">×</div>
<img src="https://via.placeholder.com/1500x1500/FFFF00" />
</div>
</div>
<div class="product-variations__color">
<img src="https://via.placeholder.com/150x150/00FFFF" />
<div class="product-variations__color-name">
Cyan
</div>
<div class="product-variations__color-popup">
<div class="close">×</div>
<img src="https://via.placeholder.com/1500x1500/00FFFF" />
</div>
</div>
<div class="product-variations__color">
<img src="https://via.placeholder.com/150x150/BFFF00" />
<div class="product-variations__color-name">
Lime
</div>
<div class="product-variations__color-popup">
<div class="close">×</div>
<img src="https://via.placeholder.com/1500x1500/BFFF00" />
</div>
</div>
<div class="product-variations__color">
<img src="https://via.placeholder.com/150x150/000000" />
<div class="product-variations__color-name">
Black
</div>
<div class="product-variations__color-popup">
<div class="close">×</div>
<img src="https://via.placeholder.com/1500x1500/000000" />
</div>
</div>
</div>Advertisement
Answer
The problem is you are triggering the other click call that adds the class back onto the element because the event listener is on a parent. So the child is triggered, followed by the parent. If you stop the click, it will not trigger on the parent.
$('.close').on('click', function(event) {
event.stopPropagation();
colorPopUp.removeClass('is-active');
});