I am making an ad card using bootstrap, I’ve placed the card inside <a>
element so that when the user clicks the card, the whole card will act as a link.
I have a favorite link that marks the ad as a favorite for the user. The problem is, since the whole card is a link, whenever I click the fav button, the parent link is clicked which is meant to go to the page of the ad, I want to stop that behavior and instead run whatever function favorite button has assigned to it.
Basically I want to stop the behavior of parent link.
My HTML for card:
<a href="" class="text-dark text-decoration-none"> <div class="card"> <div class="card-img-top"> <img src="{{ url_for('static', filename='images/test/table-with-various-goods-in-shop.jpg') }}" alt="Card Title"> </div> <div class="card-body"> <h5 class="card-title">Price</h5> <h6 class="card-subtitle mb-2 text-muted">Title</h6> <span class="fa fa-heart-o favorite-ad-card-btn" id="favoriteAdCardBtn"></span> <div class="footer mt-4"> <small class="float-start text-muted">Location</small> <small class="float-end text-muted">Time</small> </div> </div> </div> </a>
My JS present in an external file:
let favoriteBtn = document.getElementById("favoriteAdCardBtn"); favoriteBtn.addEventListener("mouseover", mouseOverFavoriteBtn); favoriteBtn.addEventListener("mouseout", mouseOutFavoriteBtn); favoriteBtn.addEventListener("click", onClickFavoriteBtn); function mouseOverFavoriteBtn(e) { if (e.target.classList.contains("fa-heart-o")) { e.target.classList.remove("fa-heart-o"); e.target.classList.add("fa-heart"); } } function mouseOutFavoriteBtn(e) { if (!(e.target.classList.contains("text-danger"))) { e.target.classList.remove("fa-heart"); e.target.classList.add("fa-heart-o"); } } function onClickFavoriteBtn() { e = window.event || e; if (this == e.target) { console.log("Fav btn clicked"); } }
Advertisement
Answer
You can prevent the default event if the button is clicked inside the anchor element’s click event handler function like the following way:
document.querySelector('a.text-dark.text-decoration-none').addEventListener("click", function(e){ if(e.target.id == 'favoriteAdCardBtn'){ e.preventDefault(); } });
Demo:
let favoriteBtn = document.getElementById("favoriteAdCardBtn"); favoriteBtn.addEventListener("mouseover", mouseOverFavoriteBtn); favoriteBtn.addEventListener("mouseout", mouseOutFavoriteBtn); favoriteBtn.addEventListener("click", onClickFavoriteBtn); function mouseOverFavoriteBtn(e) { if (e.target.classList.contains("fa-heart-o")) { e.target.classList.remove("fa-heart-o"); e.target.classList.add("fa-heart"); } } function mouseOutFavoriteBtn(e) { if (!(e.target.classList.contains("text-danger"))) { e.target.classList.remove("fa-heart"); e.target.classList.add("fa-heart-o"); } } function onClickFavoriteBtn(e) { e = window.event || e; if (this == e.target) { console.log("Fav btn clicked"); } } document.querySelector('a.text-dark.text-decoration-none').addEventListener("click", function(e){ if(e.target.id == 'favoriteAdCardBtn'){ e.preventDefault(); } });
<link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet"> <a href="" class="text-dark text-decoration-none"> <div class="card"> <div class="card-img-top"> <img src="{{ url_for('static', filename='images/test/table-with-various-goods-in-shop.jpg') }}" alt="Card Title"> </div> <div class="card-body"> <h5 class="card-title">Price</h5> <h6 class="card-subtitle mb-2 text-muted">Title</h6> <span class="fa fa-heart-o favorite-ad-card-btn" id="favoriteAdCardBtn"></span> <div class="footer mt-4"> <small class="float-start text-muted">Location</small> <small class="float-end text-muted">Time</small> </div> </div> </div> </a>