I was using the answer provided in:
How can I find each table cell's "visual location" using jQuery?
But it doesn’t seem to work in this case: http://jsfiddle.net/TRr6C/9/
Notice the 1,3 1,4 and 2,4 should be 1,4 1,5 and 2,5
Anyone see whats wrong?
Or is there any better solution to get the cellIndex and rowIndex from a table cell taking into consideration colspan and rowspan?
Here is the code:
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;
}
}
});
});
return {
rows: rows,
cols: cols
};
}
My solution is in form of jQuery plugin since I can imagine more than one purpose of having this information. It can be used as in:
The position is in form of
{ top: rows, left: cols }.On its first call, table is scanned and
TDelements getdataitems with their cached position. (Cache can be rebuilt by calling with argumenttrue). All further calls just return that cached value.Hope this helps!
jsfiddle
Full source: