Die ausgewählte Antwort hier ist eine wirklich nette Lösung, aber es gibt einen schwerwiegenden Fehler, der in der ursprünglichen JS-Geige ( http://jsfiddle.net/bgrins/tzYbU/ ) offensichtlich ist : Versuchen Sie, die längste Reihe zu ziehen ( God Bless You, Mr. Rosenwasser ) und der Rest der Zellbreiten kollabieren.
Dies bedeutet, dass das Festlegen der Zellenbreiten in der gezogenen Zelle nicht ausreicht. Sie müssen auch die Breite der Tabelle festlegen.
$(function () {
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.width(cell.width());
});
$('#sortFixed tbody').sortable().disableSelection();
});
JS Fiddle: http://jsfiddle.net/rp4fV/3/
Dies behebt das Problem, dass die Tabelle nach dem Ziehen der ersten Spalte zusammenfällt, führt jedoch eine neue ein: Wenn Sie den Inhalt der Tabelle ändern, werden die Zellengrößen jetzt behoben.
Um dies beim Hinzufügen oder Ändern von Inhalten zu umgehen, müssen Sie die eingestellten Breiten löschen:
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.css('width','');
});
Fügen Sie dann Ihren Inhalt hinzu und korrigieren Sie die Breite erneut.
Dies ist immer noch keine vollständige Lösung, da Sie (insbesondere bei einer Tabelle) einen Platzhalter benötigen. Dazu müssen wir beim Start eine Funktion hinzufügen, die den Platzhalter erstellt:
$('#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/