【问题标题】:Javascript select entire row (change background color) of a table with checkbox and deselect when next checkbox is clickedJavascript使用复选框选择表格的整行(更改背景颜色)并在单击下一个复选框时取消选择
【发布时间】:2020-08-14 04:59:57
【问题描述】:

我有一个表格,我想在其中选择整行(更改背景颜色)。按复选框选择行,并选择下一行时,前一行必须取消选择。

这是我的桌子

<table id="table" border="1">
  <tr>
    <th></th>
    <th>ID</th>
    <th>Name</th>
    <th>Surname</th>
  </tr>
  <tr>
    <td class='row'>
      <input type='checkbox' class='check' onclick='markRow(0)'>
    </td>
    <td class='row'>-</td>
    <td class='row'>-</td>
    <td class='row'>-</td>
  </tr>
  <tr>
    <td class='row'>
      <input type='checkbox' class='check' onclick='markRow(1)'>       
    </td>
    <td class='row'>-</td>
    <td class='row'>-</td>
    <td class='row'>-</td>
  </tr>
  <tr>
    <td class='row'>
      <input type='checkbox' class='check' onclick='markRow(2)'>       
    </td>
    <td class='row'>-</td>
    <td class='row'>-</td>
    <td class='row'>-</td>
  </tr>
</table>
#table{
  border-collapse: collapse;
}

我将每个表格单元格命名为 class="row"。计算定位特定行的间隔并使用 for 循环,我应该能够为这些表格单元格设置背景颜色。间隔是:第一行是 0-3,第二行是 4-7,第三行是 8-11。

我试过了:

var clear1 = 0;
var clear2 = 0;
//these two should clear the previous row

var counter = 0;  
//this will ensure that clearing doesn't happen the first time


//function parameter is given by this checkbox from table  
//<input type='checkbox' class='check'onclick='markRow(0)'> 
function markRow(rowNumber){  
  var row = document.getElementsByClassName('row');
  var checkboxes = document.getElementsByClassName('check');

  var interval = rowNumber*4;

  for(var i=interval;i<=interval+3;i++){
    row[i].style = "background-color: dodgerblue;";
  }
  //for example if function gets parameter rowNumber=2, then it will color the cells in interval 8-11

  counter++;
  if(counter>1){
    for(var i=clear1;i<=clear2;i++){
      row[i].style = "";
    }
    checkboxes[clear1].checked = false;
  }
  clear1 = interval;
  clear2 = interval+3;
  //these two will save the interval from the current row and next time, for loop will delete style 
  //using this interval
}

它适用于第一行,但第二行和第三行有时不会检查并且不会被取消选择。我不知道可能是什么问题。

【问题讨论】:

    标签: javascript html checkbox html-table row


    【解决方案1】:

    您始终可以清除所有复选框和背景颜色,然后应用正确的背景颜色并使用行索引和复选框索引检查复选框

    您还需要将类分配给您的行,以便使用 getElementsByClassName 获取它们而不是单元格。

    避免使用全局变量,你不需要它们。

    小提琴证明:https://jsfiddle.net/en20wa9j/

    function markRow(rowNumber) {
      const row = document.getElementsByClassName('rowclass');
      const checkboxes = document.getElementsByClassName('check');
      // clear everything
      for (let i = 0; i < row.length; i++) {
        row[i].style = "background-color: transparent";
        checkboxes[i].checked = false;
      }
      // check the checkbox and color the row
      checkboxes[rowNumber].checked = true;
      row[rowNumber].style = "background-color: dodgerblue;";
    }
    <table id="table" border="1">
      <tr>
        <th></th>
        <th>ID</th>
        <th>Name</th>
        <th>Surname</th>
      </tr>
      <tr class='rowclass'>
        <td>
          <input type='checkbox' class='check' onclick='markRow(0)'>
        </td>
        <td class='row'>-</td>
        <td class='row'>-</td>
        <td class='row'>-</td>
      </tr>
      <tr class='rowclass'>
        <td>
          <input type='checkbox' class='check' onclick='markRow(1)'>
        </td>
        <td class='row'>-</td>
        <td class='row'>-</td>
        <td class='row'>-</td>
      </tr>
      <tr class='rowclass'>
        <td>
          <input type='checkbox' class='check' onclick='markRow(2)'>
        </td>
        <td class='row'>-</td>
        <td class='row'>-</td>
        <td class='row'>-</td>
      </tr>
    </table>

    【讨论】:

    • 将类分配给行是更简单的解决方案,我首先尝试过,但由于某种原因,这条线不会为行着色 row[rowNumber].style = "background-color: dodgerblue ;";即使这样也不起作用
    • 你的意思是它不着色?我发布的示例有效。这是你说的一些新代码吗?
    • 是的示例有效。我忘了提到它在我的项目中复制时不起作用。也许我的代码中有一些东西使它不起作用,但我认为给它内联 css 属性应该总是有效的。
    • 不管怎样,我发现并修复了原始代码中的一个错误,它按预期工作。
    • 它现在可以工作了,我在使用 PHP 时必须清除缓存
    【解决方案2】:

    问题出在checkboxes[clear1].checked = false;,因为只有3个复选框,而不是像行,所以你应该改用下面的行:

    checkboxes[clear1 / 4].checked = false;
    

    其中clear1 / 4 在之前选择行时将分别为 0、1、2。

    【讨论】:

    • 是的,我弄错了“row”和“check”类。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签