ここで選択した答えは本当に良い解決策ですが、元のJSフィドル(http://jsfiddle.net/bgrins/tzYbU/)に明らかな重大なバグが1つあります。最長の行をドラッグしてみてください(God Bless You、Mr .Rosewater)、および残りのセル幅は縮小します。
これは、ドラッグされたセルのセル幅を固定するだけでは不十分であることを意味します。テーブルの幅も固定する必要があります。
$(function () {
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.width(cell.width());
});
$('#sortFixed tbody').sortable().disableSelection();
});
JSフィドル: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フィドル:http : //jsfiddle.net/rp4fV/4/