Reputation: 25
I want to change the background color of the td when I checked the checkbox. But I don't know how to make it done. Please help me.
Each tr will consist a row of data. And each data part will have a checkbox which allow user to check it to highlight those specific data only.
I want to make it look like this.
//The script is empty because I don't know how to write
table {
width: 100%;
border-collapse: collapse;
}
th {
width: 10%;
}
td {
text-align: center;
border: 1px solid black;
}
.selected {
background: red;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link type="text/css" rel="stylesheet" href="views/css/index.css">
</head>
<body>
<table id="myTable">
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
<% for(let a = 0; a < 10; a ++){ %>
<tr>
<td id="first">X</td>
<td id="first">X</td>
<td id="first"><input type="checkbox"></td>
<td>X</td>
<td>X</td>
<td><input type="checkbox"></td>
<td>X</td>
<td>X</td>
<td><input type="checkbox"></td>
</tr>
<% } %>
</table>
</body>
</html>
Upvotes: 0
Views: 474
Reputation: 997
Without the need of any data attributes and assuming you want to mark a specific group of cells together, you can do something like this:
document.querySelectorAll('#myTable input').forEach((btn, i) => {
btn.addEventListener("change", () => {
// If first button changed, it is also the last
let startingIndex = 0;
let endingIndex = parseInt(document.querySelectorAll('#myTable input')[0].dataset.group) - 1;
// If anything else, we need to calculate the correct start/end indexes
if (i !== 0) {
for (let y = 0; y < i; y++) {
startingIndex += parseInt(document.querySelectorAll('#myTable input')[y].dataset.group);
endingIndex += parseInt(document.querySelectorAll('#myTable input')[y + 1].dataset.group);
}
}
for (let a = startingIndex; a <= endingIndex; a++) document.querySelectorAll('#myTable tr td')[a].classList.toggle('selected');
});
});
table {
width: 100%;
border-collapse: collapse;
}
th {
width: 5%;
}
td {
text-align: center;
border: 1px solid black;
transition: all 0.3s ease;
}
.selected {
background: red;
}
<table id="myTable">
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
<th>10</th>
<th>11</th>
<th>12</th>
<th>13</th>
<th>14</th>
<th>15</th>
<th>16</th>
<th>17</th>
<th>18</th>
<th>19</th>
<th>20</th>
</tr>
<tr>
<td>X</td>
<td>X</td>
<td><input data-group=3 type="checkbox"></td>
<td>X</td>
<td><input data-group=2 type="checkbox"></td>
<td>X</td>
<td>X</td>
<td>X</td>
<td><input data-group=4 type="checkbox"></td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td><input data-group=5 type="checkbox"></td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td><input data-group=6 type="checkbox"></td>
</tr>
<tr>
<td><input data-group=1 type="checkbox"></td>
<td>X</td>
<td>X</td>
<td>X</td>
<td><input data-group=4 type="checkbox"></td>
<td>X</td>
<td>X</td>
<td>X</td>
<td><input data-group=4 type="checkbox"></td>
<td>X</td>
<td>X</td>
<td><input data-group=3 type="checkbox"></td>
<td>X</td>
<td>X</td>
<td><input data-group=3 type="checkbox"></td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td><input data-group=5 type="checkbox"></td>
</tr>
</table>
Upvotes: 1
Reputation: 358
You can use data attribute to mark group of your data
Something like this
const addClass = elements => {
for (var i = 0; i < elements.length; ++i) {
elements[i].classList.add('selected');
}}
const removeClass = elements => {
for (var i = 0; i < elements.length; ++i) {
elements[i].classList.remove('selected');
}}
let cbox = document.querySelectorAll('input[type="checkbox"]');
cbox.forEach(box => {
box.addEventListener('change', evt => {
const dataKey = evt.target.value;
const tdWithDataKey = document.querySelectorAll(`[data-key="${dataKey}"]`);
if(evt.target.checked) {
addClass(tdWithDataKey);
} else {
removeClass(tdWithDataKey);
}
});
});
table {
width: 100%;
border-collapse: collapse;
}
th {
width: 10%;
}
td {
text-align: center;
border: 1px solid black;
}
.selected {
background: red;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link type="text/css" rel="stylesheet" href="views/css/index.css">
</head>
<body>
<table id="myTable">
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
<tr>
<td data-key="1">X</td>
<td data-key="1">X</td>
<td data-key="1">X</td>
<td data-key="1"><input type="checkbox" value="1"></td>
<td data-key="2">X</td>
<td data-key="2"><input type="checkbox" value="2"></td>
<td data-key="3">X</td>
<td data-key="3">X</td>
<td data-key="3"><input type="checkbox" value="3"></td>
</tr>
<tr>
<td data-key="1a">X</td>
<td data-key="1a">X</td>
<td data-key="1a">X</td>
<td data-key="1a"><input type="checkbox" value="1a"></td>
<td data-key="2a">X</td>
<td data-key="2a"><input type="checkbox" value="2a"></td>
<td data-key="3a">X</td>
<td data-key="3a">X</td>
<td data-key="3a"><input type="checkbox" value="3a"></td>
</tr>
</table>
</body>
</html>
Upvotes: 1