I got the following simple page.
<style>
#notifier {
position: fixed;
width: 320px;
bottom: 0;
left: 0;
padding: 10px;
}
#notification-silo {
width: 300px;
height: 100%;
position: relative;
}
#notification-silo .notification {
position: absolute;
bottom: 0;
width: 300px;
background-color: #fff;
box-shadow: 2px 2px 8px 2px #666;
}
#notification-silo .header {
background-color: #1266AB;
color: #fff;
padding: 5px;
}
#notification-silo .error .header {
background-color: #1266AB;
}
#notification-silo .warning .header {
background-color: #ff8f5f;
}
#notification-silo .header .title {
width: 260px;
display: inline-block;
}
#notification-silo .header .close-wrapper {
display: inline-block;
}
#notification-silo .header .close-wrapper button {
height: 25px;
width: 25px;
background-color: #2277bb;
border: 0;
color: #ff8f5f;
border-radius: 50%;
}
#notification-silo .warning .header .close-wrapper button {
background-color: #ffaa77;
color: #2277bb;
}
#notifier .body {
padding: 5px;
border: 1px solid lightgray;
}
</style>
<div id="notifier">
<div id="notification-silo">
</div>
</div>
<script>
function show(html) {
let notification, notificationArray, body, closeButton, existingNotificationHeights, sum, bottom, notification_template, siloElement, marginBetweenNotifications;
siloElement = document.querySelector("#notification-silo");
notification_template = `<div class="notification">
<div class="header">
<div class="title">Message</div>
<div class="close-wrapper">
<button>X</button>
</div>
</div>
<div class="body"></div>
</div>`;
marginBetweenNotifications = 10;
// calculate position
existingNotificationHeights = [...siloElement.children].map(notification => notification.offsetHeight);
sum = existingNotificationHeights.length ? existingNotificationHeights.reduce((a, b) => a + b) : 0;
bottom = sum + existingNotificationHeights.length * marginBetweenNotifications;
// creat elements by update innerHTML
siloElement.innerHTML += notification_template.trim();
notificationArray = [...siloElement.querySelectorAll(".notification")];
notification = notificationArray[notificationArray.length - 1];
notification.style.bottom = bottom + "px";
body = notification.querySelector(".body");
body.innerHTML += html;
// add event listener to close button
closeButton = notification.querySelector(".close-wrapper button");
closeButton.addEventListener("click", (ev) => {
console.log("click is fired");
});
};
show("System message 1");
show("System message 2");
show("System message 3");
show("System message 4");
show("System message 5");
</script>
It meant to create simple notification messages through show(msg) function. Here is the interesting part - when create few messages and try to add event listener to their close buttons, only the last button get a listener and actually listen for click event. All other close buttons do not react to mouse click. Can you please help me to understand why?
siloElement.innerHTML += notification_template.trim()wipes off the html content and re-assigned again, so previous events are removed.