Si può fare in questo modo, forse non il più elegante ma funziona, spero che funziona per voi:
prima preparare la tavola con gli attributi.
function prepare()
{
var row = 0;
$('table tr').each(function()
{
var tr = $(this);
var curCol = 0;
var caught = $(this).data('caught');
$('td', this).each(function (index)
{
while (caught && caught[curCol])
curCol++;
var colspan = $(this).attr('colspan') || 1;
var rowspan = $(this).attr('rowspan');
$(this).attr('start', curCol);
$(this).attr('end', curCol + colspan - 1);
$(this).attr('startrow', row);
$(this).attr('endrow', row + rowspan - 1);
var next_tr = tr.next();
for (var i = 0; i < rowspan - 1; i++)
{
var curCaught = next_tr.data('caught') || [];
for (var j = curCol; j < curCol + colspan; j++)
curCaught[j] = true;
next_tr.data('caught', curCaught);
next_tr = next_tr.next();
}
curCol += colspan;
});
row++;
})
}
allora si può chiamare questa funzione di inviarlo i tdies selezionati:
function getBoundingRectangle(tds)
{
var minCol = tds.min(function(){return $(this).attr('start');});
var maxCol = tds.max(function(){return $(this).attr('end');});
var minrow = tds.min(function(){return $(this).attr('startrow');});
var maxrow = tds.max(function(){return $(this).attr('endrow');});
var rec = $('td').filter(function()
{
var startRow = $(this).attr('startrow');
var startCol = $(this).attr('start');
var endRow = $(this).attr('endrow');
var endCol = $(this).attr('end');
return (startRow >= minrow && startRow <= maxrow && startCol >= minCol && startCol <= maxCol) ||
(endRow >= minrow && endRow <= maxrow && endCol >= minCol && endCol <= maxCol);
});
if (rec.length == tds.length)
{
debugger;
var first = rec.filter('[start=' + minCol + '][startrow=' + minrow + ']')
rec.not(first).remove();
first.attr('colspan', maxCol - minCol + 1);
first.attr('rowspan', maxrow - minrow + 1);
return rec;
}
else return getBoundingRectangle(rec);
}
aggiungono anche i prossimi funzioni di utilità:
$.fn.max = function(func)
{
var arr = this.map(func).toArray();
return Math.max.apply(Math, arr);
};
$.fn.min = function(func)
{
var arr = this.map(func).toArray();
return Math.min.apply(Math, arr);
};
Le celle contengono dati? Suppongo che tu abbia bisogno della funzione jQuery che lo farebbe automaticamente? Quando unisci le celle, ti unisci sempre con le celle a destra e in basso come nell'esempio o dovrebbe essere facoltativo? – Bizniztime
La domanda non è chiara, se sei stato in grado di unire colonne e righe su quale problema stai incontrando quando unisci le 6 celle. – Daniel
@Daniel - ho dato uno scenario più semplice in cui questo problema potrebbe venire e ho visto anche altri problemi, che sono ancora più complessi di quello spiegato. Bizniztime - deve essere il flusso libero una persona può iniziare dalla maggior parte delle celle e selezionare fino alla prima o può unire 2 celle ciascuna da 2 righe in 1 go fondamentalmente un blocco di 4 (2x2) deve essere unito – Varun