无法使getElementsByTagName正常工作

时间:2013-03-22 08:19:28

标签: javascript dom

我正在尝试创建一个JavaScript,用于替换多个表中每行的颜色。问题是有些表根本不会改变。所以,我正在尝试使用此代码来获取表的行:

function alternateRows(myTable)
  var rows = document.getElementsByTagName("table").getElementsByClassName(myTable).getElementsByTagName("tr");

而且,在HTML中:

<body onload="alternateRows('myTable')";>
  <table class="myTable">

如果我使用id属性并将JavaScript更改为:

,我可以正常工作
var rows = document.getElementById(myTable).getElementsByTagName("tr");

任何建议都会很棒。谢谢!

4 个答案:

答案 0 :(得分:2)

getElementsByTagName返回NodeList,这就是为什么它调用getElements而不是getElement。 NodeList没有定义“getElementsByClassName”方法,这是你应该看到的错误。

你需要使用循环。也知道你可以使用CSS选择器,所有现代浏览器都支持IE 8及更低版本。

现代浏览器的CSS(或IE8-例如帮助程序库,如ie9.js

table.mytable tr:nth-child(odd) {
    background-color: black;
}
table.mytable tr:nth-child(even) {
    background-color: white;
}

答案 1 :(得分:2)

有两种DOM方法:

  1. 返回对单个节点的引用的方法。例如getElementByIdquerySelector

  2. 返回列表节点的方法。例如,getElementsByTagNamegetElementsByClassNamequerySelectorAll

  3. 返回节点列表的那些方法通常会返回一个NodeList [MDN]对象,该对象的接口非常有限。您可以使用它来访问列表中的单个元素,就像数组一样,与DOM节点(或元素)具有相同的接口。

    如果要在列表中的元素上调用更多DOM方法或DOM属性,可以直接使用其索引访问特定节点,或者在列表上迭代,并为每个元素执行此操作元素:

    var elements = document.getElementsByTagName('div');
    
    for(var i = 0, l = elements.length; i < l; i++) {
        // do something with elements[i]
    }
    

    请注意,NodeList通常是实时,这意味着对DOM的任何更改(例如删除div元素)都会自动更新列表。


    在您的特定情况下,您必须选择:

    1. 使用querySelectorAll选择所有行:

      var rows = document.querySelectorAll('table.' + myTable + '  tr');
      
    2. 或迭代所选元素:

      var rows = [];
      var tables  = document.getElementsByTagName("table");
      for (var i = 0, l = tables.length; i < l; i++) {
          // check whether it is a table with class in the variable `myTable`
          if ((' ' + tables[i].className + ' ').indexOf(' ' + myTable + ' ') > -1) {
              rows = rows.concat(tables[i].getElementsByTagName('tr'));
          }
      }
      

      您可以直接使用getElementsByClassName代替按标记名称选择元素然后测试其类,但不像querySelectorAll那样广泛支持。

答案 2 :(得分:0)

试试这个:

您只能getElementsByTagNamegetElementsByClassName使用 像:

var rows = document.getElementsByTagName("table")[0].getElementsByTagName("tr");

var rows = document.getElementsByClassName('myTable')[0].getElementsByTagName("tr");

或使用querySelectorAll

<强>语法:

var matches = document.querySelectorAll("div.note, div.alert");

示例中

var rows = document.querySelectorAll("table."+myTable).getElementsByTagName("tr");

getElementsByTagName提供数组,因此您应该将其与zero index一起使用 getElementsByClassName

也是如此

阅读https://developer.mozilla.org/en-US/docs/DOM/element.getElementsByTagNamehttps://developer.mozilla.org/en-US/docs/DOM/document.getElementsByClassName

答案 3 :(得分:0)

如果必须以相同方式修改所有表,则可以使用以下代码:

var tables = document.getElementByTagName("table");
for (var i in tables)
{
    var rows = tables[i].getElementByTagName("tr");
    //Alternating code here
}