我正在使用jQuery UI进行排序,以使我的表格可以排序。该代码似乎工作正常,但因为我没有向td
添加宽度,当我拖动tr
时,它缩小了内容。
例如;如果我开始拖动时表格行为500px,则变为300px。我假设发生了这种情况,因为网格中没有定义宽度。那是因为我为td
s使用了两个类(fix
和liquid
)。
fix
类使td
等于内容宽度,liquid
使td
宽度为100%。这是我对网格表的方法,而不必将宽度分配给td
s。
知道如何使用我的方法进行可排序的工作吗?
答案 0 :(得分:249)
我找到了答案here。
我稍微修改了它来克隆行,而不是将宽度添加到原始:
helper: function(e, tr)
{
var $originals = tr.children();
var $helper = tr.clone();
$helper.children().each(function(index)
{
// Set helper cell sizes to match the original sizes
$(this).width($originals.eq(index).width());
});
return $helper;
},
答案 1 :(得分:159)
我认为它可以提供帮助:
.ui-sortable-helper {
display: table;
}
答案 2 :(得分:28)
这里选择的答案是一个非常好的解决方案,但它有一个严重的错误,在原始的JS小提琴(http://jsfiddle.net/bgrins/tzYbU/)中很明显:尝试拖动最长的行(上帝保佑你,先生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','');
});
然后添加您的内容,然后再次修复宽度。
这仍然不是一个完整的解决方案,因为(特别是对于表格)你需要一个放置占位符。为此,我们需要在构建占位符的start上添加一个函数:
$('#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();
答案 3 :(得分:4)
当您的表格准备好进行排序时,请调用以下代码, 这将确保您的td元素具有固定的,而不会破坏表结构。
$(".tableToSort td").each(function () {
$(this).css("width", $(this).width());
});
答案 4 :(得分:0)
Keith的解决方案很好,但在Firefox中产生了一点点破坏,并没有加入colspans,而是提示他们。 (膝盖上的旧js弦型疼痛)
替换此行:
cellCount += colspan;
with:
cellCount += colspan-0;
解决了这个问题。 (因为js被迫将变量视为数字而不是字符串)
答案 5 :(得分:0)
Dave James Miller的回答对我有用,但是由于我页面上容器div的布局,用鼠标光标拖动的助手偏离了鼠标的位置。为了解决这个问题,我在helper回调中添加了以下内容
$(document.body).append($helper);
以下是添加上述行的完整回调:
helper: function (e, tr) {
var $originals = tr.children();
var $helper = tr.clone();
$helper.children().each(function (index) {
// Set helper cell sizes to match the original sizes
$(this).width($originals.eq(index).width());
});
// append it to the body to avoid offset dragging
$(document.body).append($helper);
return $helper;
}
我会在Dave的回答中加上这个评论作为评论,但我没有足够的代表这个帐户。
答案 6 :(得分:0)
好像disableSelection()
- 方法很糟糕,现在已经弃用了。我无法在Mozilla Firefox 35.0
中的可排序行中使用文本输入。它不再是可以专注的。
答案 7 :(得分:0)
$(function() {
$( "#sort tbody" ).sortable({
update: function () {
var order = $(this).sortable("toArray").join();
$.cookie("sortableOrder", order);
}
});
if($.cookie("sortableOrder")){
var order = $.cookie("sortableOrder").split(",");
reorder(order, $("#sort tbody"));
}
function reorder(aryOrder, element){
$.each(aryOrder, function(key, val){
element.append($("#"+val));
});
}
});
答案 8 :(得分:0)
经过多次尝试,我只是尝试了一个简单的解决方案,该解决方案完善了Dave James Miller的解决方案,以防止在拖动最大行时缩小表。我希望这会有所帮助:)
// Make sure the placeholder has the same with as the orignal
var start = function(e, ui) {
let $originals = ui.helper.children();
ui.placeholder.children().each(function (index) {
$(this).width($originals.eq(index).width());
});
}
// Return a helper with preserved width of cells
var helper = function(e, tr) {
let $helper = tr.clone();
let $originals = tr.children();
$helper.children().each(function (index) {
$(this).width($originals.eq(index).outerWidth(true));
});
return $helper;
};
答案 9 :(得分:-1)
.sortable({
helper: function (e, ui) {
ui.children().each(function () {
$(this).width($(this).width());
});
return ui;
}
});
答案 10 :(得分:-4)
将sortable应用于表的tbody元素,并将帮助器设置为'clone',如jquery-ui的API
中所述$("$my-table-tbody").sortable({
helper: "clone"
});