jQueryUI可排序以将列拖放到响应表中

时间:2019-02-10 10:08:04

标签: jquery-ui drag-and-drop jquery-ui-sortable dynamic-columns

我正在尝试学习jQueryUI可排序功能,以使其在我在网页上使用的响应表上正常工作。

我做了jsfiddle进行了一些测试,但我不知道如何拖放列(不仅如此)。

我怀疑我应该使用“ connectWith”(或“ items”?)选项,并连接所有与拖曳的th共享相同id的td,但我做不到。

我什至不确定这实际上是为“ connectWith”或“ items”创建的,但是在文档中找不到其他东西似乎可以帮助我实现列的拖放。

HTML:

<html>
    <body>
        <table>
           <thead>
                <tr>
                    <th>Col 1</th>
                    <th>Col 2</th>
                    <th>Col 3</th> 
                    <th>Col 4</th>
                </tr>
           </thead>
           <tbody>
                <tr>
                    <td>data 1</td>
                    <td>data 2</td>
                    <td>data 3</td>
                    <td>data 4</td>
                </tr>
                <tr>
                    <td>data 1</td>
                    <td>data 2</td>
                    <td>data 3</td>
                    <td>data 4</td>
                </tr>
            </tbody>
        </table>
    </body>
</html>

CSS:

*html, body {
    margin:0px;
    padding:0px;
    width:100%;
    height:100%;
}

 body:before{
     content: "";
     display: block;
     position: fixed;
     left: 0;
     top: 0;
     width: 100%;
     height: 100%;
 }

table{
    table-layout: fixed;
    margin: 0 auto;
    border-collapse: collapse;
    overflow: hidden;
    white-space: nowrap; 
    width:100%;
    color:#000;
    float:left;
}

tr{
    display:table-row;
    border: 1px solid black
}

th, td {
    border:1px solid #000;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    display: table-cell;
    text-align:center;
}

th{
    position: relative;
    background:#bbb;
}

jQuery:

$( function() {
    $('thead tr').sortable({
        start: function(e, ui)
        {
            var ind_th= ui.item.index();
            $('tbody td:nth-child('+(ind_th+1)+')').addClass('drg').css('color','red');
        },
        connectWith:".drg",
        stop: function(e, ui)
        {
            $('tbody td').removeClass('drg')
        }
    });
});

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这不是很漂亮,但是可以完成工作。

工作示例:https://jsfiddle.net/Twisty/q7oyh9mj/53/

JavaScript

$(function() {
  $('thead tr').sortable({
    containment: "parent",
    placeholder: "placeholder",
    opacity: 0.5,
    helper: "clone",
    axis: 'x',
    start: function(e, ui) {
      var ind_th = ui.item.index();
      $('tbody tr').each(function(ind, el) {
        $('td', el).eq(ind_th).addClass('drg').css('color', 'red');
      });
    },
    stop: function(e, ui) {
      var itInd = ui.item.index();
      $("tbody tr").each(function(ind, el) {
        var cell = $(".drg", el).detach();
        cell.insertBefore($("td", el).eq(itInd));
        cell.removeClass("drg").css("color", "black");
      });
    }
  });
  $('thead tr').disableSelection();
});

您也可以使用function(event, element)创建自己的帮助程序,但在stopupdate中的啮合效果不佳。

因此,在start中,我添加了类drg以帮助标识将要移动的单元格。触发stop之后,我将使用.detach()将它们从行中删除,然后使用insertBefore()根据标题索引将它们放回到行中的新位置。

如果您有很多数据,建议您查看DataTables。我相信它可以提供此功能。

更新

新示例:https://jsfiddle.net/Twisty/q7oyh9mj/72/

两个小变化:

  1. 已移除containment;这是为了防止标题拖到表格边界之外,并且无法将其放置在第一位置。
  2. 添加if,以将下降点何时作为最后一项

您还可以调整tolerance选项:https://jsfiddle.net/Twisty/q7oyh9mj/73/

您选择的管理方式。

希望有帮助。