getElementsByClassName不起作用

16

我编写了一个 PHP 页面,可以将来自 MySQL 数据库的信息整齐地显示在表格中。我想使用 onLoad 事件处理程序隐藏空的表格行。

以下是一个示例表格和代码,当 <td> 没有内容时隐藏它,但我只能通过不同的 ID 使其正常工作:

        <script type="text/javascript">
        function hideTd(id){
            if(document.getElementById(id).textContent == ''){
              document.getElementById(id).style.display = 'none';
            }
          }
        </script>
        </head>
        <body onload="hideTd('1');hideTd('2');hideTd('3');">
        <table border="1">
          <tr>
            <td id="1">not empty</td>
          </tr>
          <tr>
            <td id="2"></td>
          </tr>
          <tr>
            <td id="3"></td>
          </tr>
        </table>
    </body>

我想做的是使用一个类来为 <td> 元素实现同样的功能,只需引用一次该类,而不是引用每个要删除的 id,这甚至不能为我的动态内容工作。我尝试使用了以下代码:

    <script type="text/javascript">
    function hideTd(){
        if(document.getElementsByClassName().textContent == ''){
          document.getElementsByClassName().style.display = 'none';
        }
      }
    </script>
    </head>
    <body onload="hideTd('1');">
    <table border="1">
      <tr>
        <td class="1">not empty</td>
      </tr>
      <tr>
        <td class="1"></td>
      </tr>
      <tr>
        <td class="1"></td>
      </tr>
    </table>
</body>

但是它不起作用。它应该隐藏具有指定类的空<td>。如何使用类而不是ID隐藏空的<td>


我已经发布了一个答案,其中包含一个函数,如果 "getElementsByClassName" 不存在,则可以作为回退方案使用。 - TmEllis
2个回答

44

这里有几个问题:

  1. 类名(和ID)不能以数字开头
  2. 你需要向 getElementsByClassName() 传递一个类。
  3. 你需要对结果集进行迭代。

示例(未经测试):

<script type="text/javascript">
function hideTd(className){
    var elements = document.getElementsByClassName(className);
    for(var i = 0, length = elements.length; i < length; i++) {
       if( elements[i].textContent == ''){
          elements[i].style.display = 'none';
       } 
    }

  }
</script>
</head>
<body onload="hideTd('td');">
<table border="1">
  <tr>
    <td class="td">not empty</td>
  </tr>
  <tr>
    <td class="td"></td>
  </tr>
  <tr>
    <td class="td"></td>
  </tr>
</table>
</body>

注意,getElementsByClassName() 在IE8及以下版本不可用更新: 或者您可以给表格一个ID并使用:
var elements = document.getElementById('tableID').getElementsByTagName('td');

获取所有 td 元素。
要隐藏父行,请使用元素的 parentNode 属性:
elements[i].parentNode.style.display = "none";

现在它可以工作了!但是如果在IE中getElementsByClassName()不可用,有没有其他方法可以隐藏空的td而不必引用每一个?另外,如果td为空,是否有一种方法可以隐藏整个tr?谢谢。 - new star
@新星:请查看我的更新答案。 - Felix Kling
更新:getElementsByClassName() 在IE9中可用。 - james.garriss

1

如果你想通过类名来实现,可以这样做:

<script type="text/javascript">
function hideTd(className){
    var elements;

    if (document.getElementsByClassName)
    {
        elements = document.getElementsByClassName(className);
    }
    else
    {
        var elArray = [];
        var tmp = document.getElementsByTagName(elements);  
        var regex = new RegExp("(^|\\s)" + className+ "(\\s|$)");
        for ( var i = 0; i < tmp.length; i++ ) {

            if ( regex.test(tmp[i].className) ) {
                elArray.push(tmp[i]);
            }
        }

        elements = elArray;
    }

    for(var i = 0, i < elements.length; i++) {
       if( elements[i].textContent == ''){
          elements[i].style.display = 'none';
       } 
    }

  }
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接