Reputation: 19
I'm building this Notification tray:
and I'm trying to check and see if all the notifications are removed, and if so, hide the tray as well. It stays on the screen right now:
.
Here's a simple enough function to remove the individual notifications:
function removeNoti(btn) {
btn.style.display = "none";
}
and here's my HTML:
<div id="noti-tray-wrapper">
<div class="notification" onclick="removeNoti(this)">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n1">x</div>
</div>
<div class="notification" onclick="removeNoti(this)">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n2">x</div>
</div>
<div class="notification" onclick="removeNoti(this)">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n3">x</div>
</div>
<div class="notification" onclick="removeNoti(this)">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n4">x</div>
</div>
</div>
So how can I tell that all of the "btn" has been removed? So that way I can do some conditions to basically set the noti-tray-wrapper to display = "none" as well?
Upvotes: 0
Views: 65
Reputation: 348
function removeNoti(btn) {
btn.style.display = "none";
}
const n1 = document.getElementById("n1");
const n2 = document.getElementById("n2");
const n3 = document.getElementById("n3");
const n4 = document.getElementById("n4");
let remove =()=>{
n1.style.display = "none"
n2.style.display = "none"
n3.style.display = "none"
n4.style.display = "none"
const container = document.getElementById("container")
if(n1.style.display == "none"){
container.innerHTML = "<p>Notification list is empty!</p>"
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="container">
<div class="notification" onclick="removeNoti(this)" id="n1">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn">x</div>
</div>
<div class="notification" onclick="removeNoti(this)" id="n2">
<div class="noti-tray" >You have unread messages </div>
<div class="noti-tray-btn">x</div>
</div>
<div class="notification" onclick="removeNoti(this)" id="n3">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn">x</div>
</div>
<div class="notification" onclick="removeNoti(this)" id="n4">
<div class="noti-tray" >You have unread messages </div>
<div class="noti-tray-btn">x</div>
</div>
</div>
</div>
<button onclick="remove()">Remove all</button>
</body>
</html>
Upvotes: 1
Reputation: 60563
You can use remove
then check for children.length
and when it equal to zero you hide it.
Also avoid the inline event handlers onclick
as they are outdated
const notifications = document.querySelectorAll('.notification')
const tray = document.querySelector('.notification-tray')
notifications.forEach(el => el.addEventListener('click', e => {
e.currentTarget.remove()
if (tray.children.length === 0) console.log('zero')
}))
.notification-tray {
background: lightgreen
}
<div class="notification-tray">
<div class="notification">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n1">x</div>
</div>
<div class="notification">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n2">x</div>
</div>
<div class="notification">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n3">x</div>
</div>
<div class="notification">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n4">x</div>
</div>
</div>
Upvotes: 1
Reputation: 1019
Here you go:
function removeNoti(btn) {
btn.classList.add('hidden');
const visibleCount = document.querySelectorAll(".notification:not(.hidden)").length;
if(!visibleCount){
document.getElementById('wrapper').classList.add('hidden');
}
}
#wrapper{
background-color: #ff8888;
border: 5px solid;
padding: 10px;
}
.notification * {
display: inline-block;
}
.hidden {
display: none;
}
<div id="wrapper">
<div class="notification" onclick="removeNoti(this)">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n1">x</div>
</div>
<div class="notification" onclick="removeNoti(this)">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n2">x</div>
</div>
<div class="notification" onclick="removeNoti(this)">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n3">x</div>
</div>
<div class="notification" onclick="removeNoti(this)">
<div class="noti-tray">You have unread messages </div>
<div class="noti-tray-btn" id="n4">x</div>
</div>
</div>
Upvotes: 1