2010-08-03 53 views
3

按位置我的意思是,单元格左边有多少列,顶部有多少行。我需要的恰恰是两个功能:我怎样才能得到一个单元格在使用JavaScript的表格中的位置?

function FindColPos(element) 
{ 
/* find column position */ 
return colPos; 
} 

function FindRowPos(element) 
{ 
/* find row position */ 
return rowPos; 
} 

的功能必须用这种方式,我不能到我的文档添加其他东西一样的ID,因为我只能访问文档的头,我会插入javascript函数。 (所有这些都是C#中另一个项目的一部分)。传递给该函数的元素将是一行中的单元格(一个<TD>元素),但如果我可以传递<TD>中的任何元素并且该函数能够识别父元素<TD>会更好。我没有足够先进的JavaScript来弄清楚自己。我其实不知道这是否可能。希望你能帮助。

回答

2

您应该可以在相同级别上重复遍历先前的节点,并计算适当的节点,直到耗尽为止。

类似

function FindColPos(element) { 
    /* find column position */ 

    var colPos = 0; 
    var prev = element.previousSibling; 

    while (prev) { 
     if (prev.nodeType == 1 && prev.nodeName.match(/t[dh]/i)) { 
      colPos++; 
     } 
     prev = prev.previousSibling; 
    } 

    return colPos; 
} 

function FindRowPos(element) { 
    /* find row position */ 

    var rowPos = 0; 
    var prev = element.parentNode.previousSibling; 

    while (prev) { 
     if (prev.nodeType == 1 && prev.nodeName.match(/tr/i)) { 
      rowPos++; 
     } 
     prev = prev.previousSibling; 
    } 

    return rowPos; 
} 

colPosrowPos将是索引,如果相同类型的所有元素被认为是基于零的阵列。

编辑:为了清楚起见,这两个单元格都假定为一个单元格作为元素。

edit2:此方法将合并的单元格计为一个。如果您需要将合并的单元格计算为片段而不是整个单元格,则可以在元素上查找colspan属性。

编辑3:FindRowPos被1关闭,现在修复。

+0

哇真的吗?让我测试它:)。 – Juan 2010-08-03 20:50:29

+0

'prev.nodeName =='TR''可能比使用正则表达式更快。 – 2010-08-03 20:51:47

+0

不错!!!!!非常感谢。 – Juan 2010-08-03 20:55:14

4

我不知道是否每个浏览器支持,但存在TableCell对象,其中有一个cellIndex财产,有一个rowIndex财产TableRow对象。

因此,这将是:

function FindColPos(element) 
{ 
    return element.cellIndex; 
} 

function FindRowPos(element) 
{ 
    return element.parentNode.rowIndex; 
} 

假设elementtd对象。

但是我还没有找到信息,哪个浏览器支持它。最新Safari浏览器也;)

更新:

这些性质列于IE 5.5甚至支持,FF 1.0,Safari浏览器1.0和Opera 7.0。所以我会说,除了遍历所有前面的元素之外,使用它们会更加快速。

您可能还对sectionRowIndex感兴趣,它给出了相对于折扣tbodytheadtfoot的索引。 rowIndex返回相对于整个表的索引。

+0

似乎在ie8中工作正常,但它只计算合并单元格一次,如果这很重要。 – lincolnk 2010-08-03 21:36:47

+0

@lincolnk:你对于合并单元格有什么意义? 'rowspan'? – 2010-08-03 21:42:19

+0

是的,还有'colspan'。 – lincolnk 2010-08-03 21:46:45