this is my problem: I've wrote this code for a bigger project
document.getElementById("swt").onclick = function() {
if (this.innerText === "Off") {
this.innerText = "On";
document.getElementById("light-status").src="assets/img/lighting_filled.svg";
} else {
this.innerText = "Off";
document.getElementById("light-status").src="assets/img/lighting_outline.svg";
}
document.getElementById("light-status").classList.toggle("light-on");
document.getElementById("card-button").classList.toggle("card-on");
}
body {
margin: 0;
height: 100%;
width: 100%;
background-color: dimgray;
font-family: 'Josefin Sans', sans-serif;
}
.grid-container {
display: grid;
grid-template-columns: minmax(256px, 20%) auto;
grid-template-rows: auto 64px;
height: 100vh;
}
.main-space-container {
grid-column: 2;
grid-row: 1;
background-color: rgba(0,0,0,0.7);
overflow-x: auto;
overflow-y: hidden;
}
.floor-container, .system-container {
display: flex;
justify-content: flex-start;
padding: 10px;
}
.card-container {
margin: 10px;
padding: 10px;
max-width: 256px;
max-height: 256px;
}
.card-title {
font-size: 24px;
font-weight: 400;
padding-left: 5px;
margin-top: 4px;
margin-bottom: 2px;
color: rgba(255,255,255,0.87);
}
.button-container {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
}
.card-button {
margin: 5px;
height: 96px;
width: 96px;
background-color: rgba(50,50,50,0.7);
border-radius: 8px;
transition: linear 0.2s;
cursor: pointer;
}
.card-on {
background-color: rgba(255,255,255,0.7);
transition: linear 0.2s;
}
/* .card-button:hover {
background-color: rgba(255,255,255,0.7);
transition: linear 0.2s;
} */
.feed-container {
padding-top: 20px;
}
.feed-text {
padding-top: 10px;
padding-bottom: 10px;
color: rgba(255,255,255,0.87);
}
/* alternative classes */
.large {
height: 202px;
width: 202px;
border-radius: 8px;
grid-column: 1 / span 2;
grid-row: 1 / span 2;
}
.four-tile {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
}
.card-icon {
grid-column: 1;
grid-row: 1;
filter: opacity(0.7);
width: 75%;
margin: auto;
}
.percentage {
grid-column: 2;
grid-row: 1;
display: flex;
justify-content: center;
align-items: center;
color: rgba(255,255,255,0.7);
}
.name {
grid-column: 1 / span 2;
display: flex;
justify-content: center;
align-items: center;
color: rgba(255,255,255,0.7);
}
.card-on > .name, .card-on > .percentage {
color: rgba(0,0,0,0.87);
transition: linear 0.2s;
}
.card-on > .card-icon {
filter: invert(87%);
transition: linear 0.2s;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Project 0</title>
<link rel="stylesheet" href="assets/css/floor.css">
</head>
<body>
<div class="grid-container">
<!-- Start main -->
<div class="system-container">
<div class="card-container">
<h3 class="card-title">Lights</h3>
<div class="button-container">
<div class="card-button four-tile" id="card-button">
<img class="card-icon" id="light-status" src="assets/img/lighting_outline.svg">
<div class="percentage" id="swt">Off</div>
<div class="name">GF</div>
</div>
<div class="card-button four-tile" id="card-button">
<img class="card-icon" id="light-status" src="assets/img/lighting_outline.svg">
<div class="percentage" id="swt">Off</div>
<div class="name">FF</div>
</div>
<div class="card-button"></div>
<div class="card-button four-tile">
<img class="card-icon" id="sched-off" src="assets/img/clock_modern_outline.svg">
<div class="name">Scheduler</div>
</div>
</div>
</div>
</div>
</div>
<!-- End main -->
</div>
<!-- start script section -->
<script src="assets/vendor/main-card.js"></script>
<!-- end script section -->
</body>
</html>
and the JS function works, but only for the first element that it found with the specified ID. I know that that's the expected behavior using getElementById
, but I've search a bit and I cannot find a way to make the function work with every element that as that ID.
Someone can help?
UPDATE: I've tweaked the code in this way adding as suggested a class (called swt) instead of an ID and adding data-status="true" (or false) inside the div; but it throws me an error saying that btn[i]
is undefined and getAttribute cannot work with it but btn[i].nodeName
give me "DIV" as a feedback so it's not undefined (or I'm understanding it wrong?)
var btn = document.querySelectorAll(".swt");
for (var i = 0; i < btn.length; i++) {
btn[i].addEventListener("click", function() {
const state = btn[i].getAttribute("data-status")
if (state === "true") {
btn.innerText = "On";
} else if (state === "false") {
btn.innerText = "Off";
} else {
btn.innerText = "Not Connected";
}
btn.parentNode.querySelector("img.light-status").classList.toggle("light-on");
btn.parentNode.classList.toggle("card-on");
})
}