Вибрана відповідь тут - дуже приємне рішення, але в ньому є одна серйозна помилка, яка очевидна в оригінальній скрипті JS ( http://jsfiddle.net/bgrins/tzYbU/ ): спробуйте перетягнути найдовший ряд ( Бог благословить вас, пане Розова вода ), а решта ширини клітин руйнуються.
Це означає, що фіксувати ширину комірок на перетягнутій комірці недостатньо - також потрібно зафіксувати ширину на столі.
$(function () {
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.width(cell.width());
});
$('#sortFixed tbody').sortable().disableSelection();
});
JS Fiddle: http://jsfiddle.net/rp4fV/3/
Це вирішує проблему згортання таблиці після перетягування першого стовпця, але вводить новий: якщо ви зміните вміст таблиці, розміри комірок тепер виправлені.
Щоб уникнути цього, додаючи або змінюючи вміст, потрібно очистити встановлений ширину:
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.css('width','');
});
Потім додайте вміст, потім знову фіксуйте ширину.
Це все ще не є повним рішенням, оскільки (особливо з таблицею) вам потрібен заповнювач краплі. Для цього нам потрібно додати функцію при запуску, яка будує заповнювач:
$('#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();
JS Fiddle: http://jsfiddle.net/rp4fV/4/