javascript - Html 和 Javascript 隐藏现有表格单元格而不破坏它们

标签 javascript html css html-table hidden

我的 jscript 可以在单击时向页面添加行,我现在需要做的是每次单击删除按钮时隐藏最底部的单元格,但单元格不能被破坏,因为如果稍后添加单元格,任何先前填充的单元格都必须显示为原样。我的计划是我可以将 body 的子节点放入一个数组中,从数组的末尾开始,朝前面工作,将我遇到的第一个可见节点更改为隐藏,然后返回,看来这会做我想做的事需要完成,但由于某种原因,我的函数正在产生任何结果......根本没有错误,没有无限循环,什么都没有。我将在下面发布我的代码。问题是,除非在 removeFields() 函数中某处出现粗心错误。我很难过。

CSS:

body{
  background-color: #2a334d;
  font: 15px/1.5 Arial, Helvetica, sans-serif;
}

.container{
  padding:45px;
  width:80%;
  color:#e8491d;
  border-color: #ffffff;
  border-width: medium;
  border:solid;
  min-height: none;
}
table{
  align-content: center;
  width:80%;
  margin-bottom: 35px;
  padding-left: 175px;
}
.shown{
  visibility: visible;
}
.hidden{
  visibility: hidden;
}
footer{
  padding:10px;
  margin-top:50px;
  color: #ffffff;
  text-align: center;
}

HTML:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="./style.css"></link>
    <script type="text/javascript" src="functions.js"></script>
    <title>assignment 3</title>
  </head>

  <body id="body">
    <div class="container">
      <table id="test" class="centered">
        <th>Number</th>
        <th>Text</th>
        <th>Length</th>
        <tr id="table" class="shown">
          <th><a id="number">1</a></th>
          <th><input id="text" onkeyup="countLength()"></input></th>
          <th><span id="length">0</span></th>
        </tr>
      </table>
      <footer>
        <tr>
          <button class="addElement" onclick="addField('table')">add</button>
          <button class="removeElement" onclick="removeField()">remove</button>
          <button class="sortElements" onclick="sortFields()">sort</button>
        </tr>
      </footer>
    </div>
  </body>
</html>

JavaScript:

var fieldCount = 1;

function countLength(){
  for(i= 0; i< fieldCount; i++){
    document.getElementsByTagName('span')[i].innerHTML=document.getElementsByTagName('input')[i].value.length;
  }
}

function addField(){
  var array = document.body.childNodes;
  for(i = 0; i< array.length ; i++){
    if(array[i].className == "hidden"){
      array[i].className = 'shown';
      return;
    }
  }
  var lastTr = document.getElementById("table");
  var cloneTr = lastTr.cloneNode(true);

  cloneTr.getElementsByTagName('a')[0].innerHTML = fieldCount+1;
  cloneTr.getElementsByTagName('input')[0].value = '';
  cloneTr.getElementsByTagName('span')[0].innerHTML = 0;
  document.getElementById("test").append(cloneTr);
  document.getElementsByTagName('input')[fieldCount].addEventListener("keyup", countLength());
  document.getElementsByTagName('input')[fieldCount].className = "shown";

  fieldCount++;
  }

  function removeField(){
    var array = document.body.childNodes;

    for(var tmp = array.length-1; tmp>=0 ; tmp--){
      if(array[tmp].className == "shown"){
        array[tmp].className = 'hidden';
        return;
      }
    }
  }

最佳答案

您确定应隐藏哪个单元格的方法无效。 array[tmp].className == "shown" 行永远不会返回 true,因为 array[tmp].className 的值为 undefined 在循环的每个实例上,查看 div 时除外。

此外,它看起来像 document.body.childNodes 只是获取 body 元素的直接后代,而不是所有后代,所以它永远不会看到 tr 元素,这很可能是它不起作用的原因。

为了解决这个问题,您需要遍历表格的子元素,如下所示:

var table = document.getElementById("测试"); var array = table.childNodes;

并且在您的 CSS 中,使用 display:none 而不是 visibility:hidden

顺便说一句,每个 tr 元素都有相同的 id 值。 id 在页面中应该是唯一的。

关于javascript - Html 和 Javascript 隐藏现有表格单元格而不破坏它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516307/

相关文章:

javascript - 添加同类事件是否会追加或覆盖之前添加的同名事件?

HTML/CSS - 改变滚动条?

python - html对css无效

jquery - 是否可以制作这样的自定义子弹?

html - 如何在移动方向更改时重置 Disqus 宽度

javascript - 使用 jquery 按样式选择元素

javascript - 如何找到特定字符串并根据字符进行替换?

css - 使用 CSS 3 垂直对齐

javascript - 如何使用 Q.js 正确链接条件(?) promise

html - html 旁边不需要的白色区域