Bạn có thể làm điều đó như thế này, có lẽ không phải là thanh lịch nhất nhưng nó hoạt động, tôi hy vọng nó làm việc cho bạn:
đầu tiên chuẩn bị bảng với các thuộc tính.
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++;
})
}
sau đó bạn có thể gọi chức năng này gửi nó trở thành tdies chọn:
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);
}
cũng thêm các chức năng tiện ích tiếp theo:
$.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);
};
Các ô của bạn có chứa bất kỳ dữ liệu nào không? Tôi đoán bạn cần jQuery chức năng đó sẽ làm điều đó tự động? Khi bạn hợp nhất các ô, bạn có luôn luôn hợp nhất với các ô ở bên phải và bên dưới như ví dụ hoặc nó sẽ là tùy chọn không? – Bizniztime
Câu hỏi không rõ ràng, nếu bạn có thể hợp nhất các cột và hàng, bạn gặp phải vấn đề gì khi hợp nhất 6 ô. – Daniel
@Daniel - tôi đã đưa ra một kịch bản đơn giản nhất mà vấn đề này có thể đến và đã thấy một số vấn đề khác nữa mà thậm chí còn phức tạp hơn sau đó giải thích. Bizniztime - nó cần phải được tự do dòng chảy một người có thể bắt đầu từ bên phải hầu hết các tế bào và chọn cho đến đầu tiên hoặc có thể hợp nhất 2 tế bào mỗi từ 2 hàng trong 1 đi về cơ bản một khối 4 (2x2) nên được sáp nhập – Varun