Câu trả lời được chọn ở đây là một giải pháp thực sự hay, nhưng nó có một lỗi nghiêm trọng rõ ràng trong fiddle JS gốc ( http://jsfiddle.net/bgrins/tzYbU/ ): hãy thử kéo hàng dài nhất ( God Bless You, Mr Nước hoa hồng ) và phần còn lại của chiều rộng tế bào sụp đổ.
Điều này có nghĩa là việc sửa độ rộng ô trên ô được kéo là không đủ - bạn cũng cần sửa độ rộng trên bảng.
$(function () {
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.width(cell.width());
});
$('#sortFixed tbody').sortable().disableSelection();
});
Câu đố về JS: http://jsfiddle.net/rp4fV/3/
Điều này khắc phục sự cố sập bảng sau khi bạn kéo cột đầu tiên, nhưng giới thiệu một cột mới: nếu bạn thay đổi nội dung của bảng thì kích thước ô hiện đã được sửa.
Để khắc phục điều này khi thêm hoặc thay đổi nội dung, bạn sẽ cần xóa độ rộng được đặt:
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.css('width','');
});
Sau đó thêm nội dung của bạn, sau đó sửa chữa độ rộng một lần nữa.
Đây vẫn chưa phải là một giải pháp hoàn chỉnh, vì (đặc biệt là với một bảng) bạn cần một trình giữ chỗ thả. Vì vậy, chúng ta cần thêm một chức năng khi bắt đầu xây dựng trình giữ chỗ:
$('#sortFixed tbody').sortable({
items: '> tr',
forcePlaceholderSize: true,
placeholder:'must-have-class',
start: function (event, ui) {
// Build a placeholder cell that spans all the cells in the row
var cellCount = 0;
$('td, th', ui.helper).each(function () {
// For each TD or TH try and get it's colspan attribute, and add that or 1 to the total
var colspan = 1;
var colspanAttr = $(this).attr('colspan');
if (colspanAttr > 1) {
colspan = colspanAttr;
}
cellCount += colspan;
});
// Add the placeholder UI - note that this is the item's content, so TD rather than TR
ui.placeholder.html('<td colspan="' + cellCount + '"> </td>');
}
}).disableSelection();
Câu đố về JS: http://jsfiddle.net/rp4fV/4/