La réponse sélectionnée ici est une très bonne solution, mais elle comporte un grave bogue qui est apparent dans le bidouillage JS original ( http://jsfiddle.net/bgrins/tzYbU/ ) : essayez de faire glisser la ligne la plus longue ( Que Dieu vous bénisse, M. Rosewater ), et le reste de la largeur des cellules s'effondre.
Cela signifie qu'il ne suffit pas de fixer les largeurs de cellule sur la cellule glissée - vous devez également fixer les largeurs sur le tableau.
$(function () {
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.width(cell.width());
});
$('#sortFixed tbody').sortable().disableSelection();
});
JS Fiddle : http://jsfiddle.net/rp4fV/3/
Cela résout le problème de l'effondrement du tableau après avoir fait glisser la première colonne, mais en introduit un nouveau : si vous modifiez le contenu du tableau, la taille des cellules est désormais fixe.
Pour contourner ce problème lors de l'ajout ou de la modification de contenu, vous devez effacer les largeurs définies :
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.css('width','');
});
Ajoutez ensuite votre contenu, puis fixez à nouveau les largeurs.
Ce n'est toujours pas une solution complète, car (surtout avec un tableau) vous avez besoin d'un placeholder de dépôt. Pour cela, nous devons ajouter une fonction au démarrage qui construit le placeholder :
$('#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/
3 votes
La réponse de Yaroslav est le VRAI MVP !
0 votes
J'ai eu le même problème, je pense que @Yaroslav a la bonne réponse pour traiter les tableaux, ce qui est le sujet de la question du PO.