我有一个包含ROWSPAN和COLSPAN的HTML表。
如何使用jQuery找到每个单元格的“可视位置”?
例如,这是我的表格的直观表示,每个单元格都填充了“视觉位置”算法应返回的内容:( 注意:我只在乎内的单元格<tbody>,列引用可以是整数,而不是字母字符,我这样做只是为了轻松指出问题)
<tbody>
+--+--+--+--+--+ | |A |B |C |D | +--+--+--+--+--+ |1 |A1|B1 |D1| +--+--+--+--+ + |2 |A2 |C2| | +--+ +--+ + |3 | |C3| | +--+--+--+--+--+ |4 |A4|B4|C4|D4| +--+--+--+--+--+ |XYZ | +--+--+--+--+--+
我尝试实现第一个,但是单元格C3的引用不准确,因为它没有考虑ROWSPANS。第二个链接也许可以合并到第一个链接的解决方案中,但是我不知道如何实现。
我希望将其用作一个函数,该函数getCellLocation(cell)将返回一个关联数组,该数组返回类似以下内容的位置:
getCellLocation(cell)
function getCellLocation(cell) { var row_number = parseInt($(cell).parent().prevAll().length) + 1; var col_number = 1; $(cell).prevAll('td').each(function() { col_number += $(this).attr('colspan') ? parseInt($(this).attr('colspan')) : 1; }); var location = new Array(); location['row'] = row_number; location['col'] = col_number; location['index'] = $('td').index(cell) + 1; return location; } $('table td').each(function(i){ var cell = getCellLocation($(this)); $(this).prepend('<span class="ref">R' + cell['row'] + ':C' + cell['col'] + ':D' + cell['index'] + '</span>'); });
这是示例表的HTML:
<table border="1" cellspacing="0"> <thead> <tr> <th></th> <th>A</th> <th>B</th> <th>C</th> <th>D</th> </tr> </thead> <tbody> <tr> <th>1</th> <td>A1</td> <td colspan="2">B1</td> <td rowspan="3">D1</td> </tr> <tr> <th>2</th> <td rowspan="2" colspan="2">A2</td> <td>C2</td> </tr> <tr> <th>3</th> <td>C3</td> </tr> <tr> <th>4</th> <td>A4</td> <td>B4</td> <td>C4</td> <td>D4</td> </tr> </tbody> <tfoot> <tr> <td colspan="5">XYZ</td> </tr> </tfoot> </table> <style> span { background-color: #ffc; margin-right: .5em;} </style>
这是我的解决方案:
function getCellLocation(cell) { var cols = cell.closest("tr").children("td").index(cell); var rows = cell.closest("tbody").children("tr").index(cell.closest("tr")); var coltemp = cols; var rowtemp = rows; cell.prevAll("td").each(function() { cols += ($(this).attr("colspan")) ? parseInt($(this).attr("colspan")) - 1 : 0; }); cell.parent("tr").prevAll("tr").each(function() { //get row index for search cells var rowindex = cell.closest("tbody").children("tr").index($(this)); // assign the row to a variable for later use var row = $(this); row.children("td").each(function() { // fetch all cells of this row var colindex = row.children("td").index($(this)); //check if this cell comes before our cell if (cell.offset().left > $(this).offset().left) { // check if it has both rowspan and colspan, because the single ones are handled before var colspn = parseInt($(this).attr("colspan")); var rowspn = parseInt($(this).attr("rowspan")); if (colspn && rowspn) { if(rowindex + rowspn > rows) cols += colspn; } if(rowspn && rowindex + rowspn > rows) cols +=1; } }); });
我正在检查同时具有colspan和rowpan的单元格,因为其余部分由此代码的前五行处理。如果单元格同时具有行跨度和列跨度,则它们应该影响不低于此单元格的其他单元格,或者除了该单元格之外,因此我需要搜索每个单元格的先前单元格进行交互。