Xylex
Xylex

Reputation: 25

Checked checkbox change specific td background color in tr

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.

This is the example of the image

I want to make it look like this.Only the first 2 td background change

//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

Answers (2)

George Chond
George Chond

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:

  • Select all input triggers
  • Attach an eventListener to each one of them with 'change'
  • For the index of each triggered input, adjust with the variable 'markUpTo' how many cells you want to mark from the start. Keep in mind the index limits.
  • Toggle a 'selected' class up to that point that will handle the background color change.
  • With this method you can easily scale this solution to include groups of 4,5,6 etc...

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

DevQuayle
DevQuayle

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

Related Questions