jquery UI可以使用table和tr宽度进行排序

153 jquery jquery-ui jquery-ui-sortable

我正在使用jQuery UI进行排序,以使我的表格网格可排序.代码似乎工作正常,但因为我没有向tds 添加宽度,当我拖动tr它缩小内容.

例如; 如果我开始拖动时表格行为500px,则变为300px.我假设发生了这种情况,因为网格中没有定义宽度.那是因为我为tds(fixliquid)使用了两个类.

fix类使得td等于所述内容的宽度和liquid使td宽度100%.这是我对网格表的方法,而不必为tds 分配宽度.

知道如何使用我的方法进行可排序的工作吗?

Dav*_*ler 252

我在这里找到了答案.

我稍微修改它以克隆行,而不是向原始添加宽度:

  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;
  },
Run Code Online (Sandbox Code Playgroud)

  • '.outerWidth()'为我工作.干杯. (20认同)
  • 这很好用,但我认为还有一个小问题; 当您拖放该行时,由于缺少行,其余的表列可能会更改宽度.我猜他们的宽度也需要修复...... (9认同)
  • 戴夫,感谢分享这个,我已经制作了一个jsFiddle,以显示原始,修改和修复之间的差异:http://jsfiddle.net/bgrins/tzYbU/.我还将使用您的解决方案更新原始帖子. (5认同)
  • 我发现宽度导致填充单元格不完全正确。我换了`$(this).width($originals.eq(index).outerWidth());` (4认同)

Yar*_*lav 161

我认为它可以帮助:

.ui-sortable-helper {
    display: table;
}
Run Code Online (Sandbox Code Playgroud)

  • 这怎么不是最好的答案?一个简单的CSS系列为我修复了它. (13认同)
  • 这个解决方案非常好,但它可以影响其他不是表的列表.我的建议是你编辑你的答案更具体.像这样=> table tr.ui-sortable-helper {display:table!important; } (13认同)
  • 我同意!你不会相信一个简单的CSS系列如何修复你的可排序表 - Stackoverflow专家感到困惑! (8认同)
  • 这就是答案.谢谢@Yaroslav (3认同)
  • 这不是一般解决方案,会导致拖动行的外观不同 (3认同)
  • 太好了!最干净的解决方案 (2认同)
  • 该修复不适用于`td`上没有定义宽度的表.当拖动行时,`td`(没有宽度 - 内联或css)将其宽度与其内容对齐.也许这也是你的情况@ Sagivb.g (2认同)

Kei*_*ith 28

这里选择的答案是一个非常好的解决方案,但它有一个严重的错误,在原始的JS小提琴(http://jsfiddle.net/bgrins/tzYbU/)中很明显:尝试拖动最长的行(God Bless You,Mr玫瑰水),其余的细胞宽度崩溃.

这意味着将单元格宽度固定在拖动的单元格上是不够的 - 您还需要修复表格上的宽度.

$(function () {
    $('td, th', '#sortFixed').each(function () {
        var cell = $(this);
        cell.width(cell.width());
    });

    $('#sortFixed tbody').sortable().disableSelection();
});
Run Code Online (Sandbox Code Playgroud)

JS小提琴:http://jsfiddle.net/rp4fV/3/

这解决了拖动第一列后表折叠的问题,但引入了一个新问题:如果更改表的内容,则单元格大小现在已修复.

要在添加或更改内容时解决此问题,您需要清除设置的宽度:

$('td, th', '#sortFixed').each(function () {
    var cell = $(this);
    cell.css('width','');
});
Run Code Online (Sandbox Code Playgroud)

然后添加您的内容,然后再次修复宽度.

这仍然不是一个完整的解决方案,因为(特别是对于表),您需要一个放置占位符.为此我们需要在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 + '">&nbsp;</td>');
    }
}).disableSelection();
Run Code Online (Sandbox Code Playgroud)

JS小提琴:http://jsfiddle.net/rp4fV/4/


vin*_*ntp 6

克隆行似乎在IE8上运行不正常,但原始解决方案确实如此.

jsFiddle测试.


Teo*_*ahi 5

当您的表准备好进行排序时调用以下代码,这将确保您的 td 元素具有固定且不破坏表结构。

 $(".tableToSort td").each(function () {
            $(this).css("width", $(this).width());
        });  
Run Code Online (Sandbox Code Playgroud)