【发布时间】:2012-05-28 21:18:15
【问题描述】:
我有以下 JavaScript 代码。
var myCellCollection = document.getElementById('myTbl').cells;
这在 IE 中运行良好,它返回一个表格单元格的集合。但同一行在 Firefox 中返回“未定义”。我正在使用 IE 9 和 Firefox 12。
【问题讨论】:
标签: javascript firefox cells
我有以下 JavaScript 代码。
var myCellCollection = document.getElementById('myTbl').cells;
这在 IE 中运行良好,它返回一个表格单元格的集合。但同一行在 Firefox 中返回“未定义”。我正在使用 IE 9 和 Firefox 12。
【问题讨论】:
标签: javascript firefox cells
你应该使用document.getElementById("myTbl").getElementsByTagName('td');
【讨论】:
alert(document.getElementById("myTable").cells); 来尝试该示例,并且效果很好!
undefined,正如预期的那样。
document.getElementById("myTable").rows[0].cells 运行代码,第二次使用 document.getElementById("myTable").cells 运行代码,那么它会显示来自商店的相同结果。我将在当天晚些时候在另一台机器上验证这一点。
今天在移植旧版 Internet Explorer 应用时偶然发现了这一点。
警告:container.getElementsByTagName('tagname') 返回 ALL container 中与查询 tagname 匹配的元素。
因此table.getElementsByTagName('td') 将返回所有td 的包括嵌套表!
但是table.cells 并没有这样做(在实现的地方)。
另外,很明显,它不会匹配th。所以这些单元格不在返回的集合中,可选地导致如何解决它们相对于 td 的顺序的“问题”......
为了满足table.cells 的预期功能(以DOM 顺序返回两个 th 和td),我编写了以下简单函数:
function tableCells(t){
if(t.cells) return t.cells; // use internal routine when supported
for(var a=[], r=t.rows, y=0, c, x; t=r[y++];){
for(c=t.cells, x=0; t=c[x++]; a.push(t));
}
return a;
}
或者,使用 'single return' by 'if-else' 打包到相同的大小完全相同,但上面的 gzip 更小。 PS:我尝试了concat-ting table.rows[X].cells,但这没有用(尽管这样做我觉得不安全)
用法示例:var identifier = tableCells( /*reference to table (or thead/tbody/tfoot) here*/ );
它将返回一个数组(不是实时集合),就像来自 table.cells 的结果一样。
希望这对某人有所帮助
【讨论】: