【问题标题】:Jquery Datatable drag and drop a row from one table to anotherJquery Datatable 将一行从一个表拖放到另一个表
【发布时间】:2017-07-15 15:19:15
【问题描述】:

我正在使用 jquery.dataTables.js,我正在尝试将行从一个表拖放到另一个表,反之亦然,从表 2 拖放到表 1,如下例所示:http://jsfiddle.net/yf47u/

上面的示例是 json,所以我想用我的 json 示例做同样的工作。

这是我的 jsfiddle:http://jsfiddle.net/f7debwj2/12/

html:

<br>
<br>
<h1>
 table1
</h1><br>
<br>
<table id="example" class="display" width="100%" cellspacing="0">
  <thead>
    <tr>
      <th>First name</th>
      <th>Place</th>
      <th>Order</th>
    </tr>
  </thead>
</table>

<br>
<br>
<h1>
 table 2
</h1><br>
<br>
<table id="example2" class="display" width="100%" cellspacing="0">
  <thead>
    <tr>
      <th>First name</th>
      <th>Place</th>
      <th>checkbox</th>
    </tr>
  </thead>
</table>

jquery:

$(document).ready(function() {
  var dt = $('#example').dataTable();
  dt.fnDestroy();
});

$(document).ready(function() {
  var url = 'http://www.json-generator.com/api/json/get/clmDuyndua?indent=2';
  var table = $('#example').DataTable({
    ajax: url,
    createdRow: function(row, data, dataIndex) {
      $(row).attr('id', 'row-' + dataIndex);
    },
    rowReorder: {
      dataSrc: 'order',
    },
    columns: [{
      data: 'order'
    }, {
      data: 'name'
    }, {
      data: 'place'
    }]
  });
  table.rowReordering();

});


$(document).ready(function() {
  var dt = $('#example2').dataTable();
  dt.fnDestroy();
});

$(document).ready(function() {
  var url = 'http://www.json-generator.com/api/json/get/cnmZgfsBKa?indent=2';
  var table = $('#example2').DataTable({
    ajax: url,
    createdRow: function(row, data, dataIndex) {
      $(row).attr('id', 'row-' + dataIndex);
    },
    rowReorder: {
      dataSrc: 'order',
    },
    columns: [{
      data: 'order'
    }, {
      data: 'name'
    }, {
      data: 'checkbox'
    }]
  });
  table.rowReordering();

});

$(document).ready(function() {
  $('body').on('mouseenter', 'input', function() {
    $('.btn').prop('disabled', true);
  });
  $('body').on('mouseout', 'input', function() {
    $('.btn').prop('disabled', false);
  });
});

【问题讨论】:

    标签: jquery json datatables


    【解决方案1】:

    这是我根据您的代码解决此问题的方法。可以将行从一个表拖放到另一个表,但我不得不动态更改 FirstName 列的值,因为否则表会认为两行具有相同的 FirstName 相等,这在删除一个时会出现问题那些相同的行。通常,在这种情况下,表应该具有唯一键。

    JavaScript:

        var rowCache;
    
        $(document).ready(function() {
            var dt = $('#example').dataTable();
            dt.fnDestroy();
        });     
    
        $(document).ready(function() {
            var dt = $('#example2').dataTable();
            dt.fnDestroy();
        });
    
        $(document).ready(function() {
            rowCache = [];
    
            var url = 'http://www.json-generator.com/api/json/get/clmDuyndua?indent=2';
            var table = $('#example').DataTable({
                ajax: url,
                createdRow: function(row, data, dataIndex) {
                  $(row).attr('id', 'row-' + dataIndex);
                },
                rowReorder: {
                  dataSrc: 'order',
                },
                columns: [{
                  data: 'order'
                }, {
                  data: 'name'
                }, {
                  data: 'place'
                }]
            });
    
            table.rowReordering();
    
            table.on('mousedown', 'tbody tr', function () {
                var $row = $(this);
                var r = table.rows(function (i, data) {
                    return data.order == $row.children().first().text();
                });
    
                if (r[0].length > 1)
                    r = r.rows(r[0][0]);    
    
                rowCache.push({ selector: 'example', row: r });
            });
    
            table.on('mouseup', mouseUp);
        });
    
        $(document).ready(function() {
          var url = 'http://www.json-generator.com/api/json/get/cnmZgfsBKa?indent=2';
          var table = $('#example2').DataTable({
            ajax: url,
            createdRow: function(row, data, dataIndex) {
              $(row).attr('id', 'row-' + dataIndex);
            },
            rowReorder: {
              dataSrc: 'order',
            },
            columns: [{
              data: 'order'
            }, {
              data: 'name'
            }, {
              data: 'checkbox'
            }]
          });
          table.rowReordering();
    
            table.on('mousedown', 'tbody tr', function () {
                var $row = $(this);
                var r = table.rows(function (i, data) {
                    return data.order == $row.children().first().text();
                });
    
                if (r[0].length > 1)
                    r = r.rows(r[0][0]);    
    
                rowCache.push({ selector: 'example2', row: r });
            });
    
            table.on('mouseup', mouseUp);
        });
    
        function mouseUp(event)
        {
            var id = $(document.elementsFromPoint(event.clientX, event.clientY))
                .filter('table')
                .attr('id');
    
            if (id && event.currentTarget.id != id)
            {
                rowCache.every(function (el, i) {
                    if (el.selector != id)
                    {                   
                        var data = el.row.data();
    
                        if (data.length > 0) {
    
                            if (!data[0].checkbox)
                                data[0].checkbox = "<input type='checkbox' />"
    
                            el.row.remove().draw();
                            var $target = $("#" + id).DataTable();
    
                            if ($target.rows()[0].length > 0)
                            {
                                var rowsArray = $target.rows().data().toArray();
                                data[0].order = rowsArray[rowsArray.length - 1].order + 1;
                            }
                            else
                                data[0].order = 1;
    
                            $target.rows.add(data.toArray()).draw();
                        }
                    }}
                );
            }   
    
            rowCache = [];
        }
    
        $(document).ready(function() {
            $('body').on('mouseenter', 'input', function() {
                $('.btn').prop('disabled', true);
            });
            $('body').on('mouseout', 'input', function() {
                $('.btn').prop('disabled', false);
            });
        }); 
    

    JSFiddle:http://jsfiddle.net/jahn08/f7debwj2/34/

    【讨论】:

    • 非常感谢您的帮助,再问两个问题我可以阻止从表 1 到表 2 的拖放吗?我也可以移动一列而不是移动整行吗?并更换?示例:将列位置从表 2 拖放到表 1 的位置?并用新数据更新该字段?而不是移动整行?谢谢。
    • 不客气。第二个问题更详细,需要一些时间来更改示例。鉴于您的目标,有必要应用几乎相同的逻辑,但应用于单元格属性而不是第一行。至于阻止,当然,可以阻止这种拖放,您只需从第一个表中删除鼠标事件。像这样:jsfiddle.net/jahn08/f7debwj2/35
    • 好的,谢谢,我更改了插件,我使用的是数据表中的官方插件,所以可以让你的代码在那个 jsfiddle 中工作吗? :jsfiddle.net/f7debwj2/37谢谢
    • 是的,确实,在这个新版本中,MouseUp 事件按预期停止工作,所以我用全局事件替换了该事件。给你:jsfiddle.net/jahn08/f7debwj2/41
    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2017-06-11
    相关资源
    最近更新 更多