交换jQuery数据表中的行

时间:2016-10-31 07:05:33

标签: javascript jquery datatables

我正在研究jQuery datatable插件。单击向下箭头时,交换当前行和下一行。单击向上箭头时,交换当前行和上一行。但我无法获得特定点击行的索引。

$(document).ready(function() {
  var table = $('#example').DataTable();

$('#example tbody').on('click', '.swapDown', function(event){
  var ind = table.row(this.closest("tr")).index();
  var movedData = table.row(this.closest("tr")).data(),
                otherData =table.row(this.closest("tr").prev()).data();
        table.row(this.closest("tr").prev()).data(otherData).draw();
        table.row(this.closest("tr")).data(movedData).draw();
  console.log(ind);
    });

 $('#example tbody').on('click', '.swapUp', function(event){
var ind = table.row(this.closest("tr")).index();
  var movedData = table.row(this.closest("tr")).data(),
                otherData =table.row(this.closest("tr").next()).data();
        table.row(this.closest("tr").next()).data(otherData).draw();
        table.row(this.closest("tr")).data(movedData).draw();
  console.log(ind);
 });
});

jsfiddle.net/UvjnT/1289/

2 个答案:

答案 0 :(得分:0)

我从未使用过此插件,但@annoyingmouse是对的。您可能打算使用$(this)而不是this,因为前者创建了一个jQuery对象,您可以在其中使用jQuery方法。我注意到的另一件事是包含的DataTables插件不是最新版本(根据datatables.net)。我不知道这对你的应用程序有多大影响,但链接的小提琴包括datatables.net的最新版本。我也不确定你从小提琴中得到的结果,但它确实在控制台中注销了一个整数,然后点击“#”;

另一件事是您的表格未必正确设置。 "交换" th元素与" Swap Up"不一致td元素,与#34; Swap Down"

相同
            <th>Swap Up</th>
        <th>Swap Down</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>Trident</td>
        <td>Internet
             Explorer 4.0</td>
        <td>Win 95+</td>
        <td><i class='fa fa-caret-down swapDown'></i></td>
        <td><i class='fa fa-caret-up swapUp'></i></td>

您可能想要反转td元素。或者命名惯例让我感到困惑。

http://jsfiddle.net/UvjnT/1291/

答案 1 :(得分:0)

我今天早上一直在玩这个,这就是我已经开始运行的,我真的不确定它是最好的解决方案,但确实有效:< / p>

$(function() {
    var table = $("#example").DataTable({
        "order": [
            [0, 'asc']
        ],
        "paging": true,
        "columns": [{
            "visible": false
        }, {
            "orderable": false
        }, {
            "orderable": false
        }, {
            "orderable": false
        }, {
            "render": function(d) {
                return $("<i/>", {
                    "class": "fa fa-caret-down swapable swapDown"
                }).prop("outerHTML");
            },
            "orderable": false
        }, {
            "render": function(d) {
                return $("<i/>", {
                    "class": "fa fa-caret-up swapable swapUp"
                }).prop("outerHTML");
            },
            "orderable": false
        }]
    });
    $('#example tbody').on('click', 'td', function(event) {
        // We're only interested in cells with a class of swapable
        if ($(this).find(".swapable")) {
            // Helper variable
            var _this = $(this).find(".swapable");
            // Total number of rows (including hidden rows (zero based index))
            var tableRows = table.data().length - 1;
            // Index of current row
            var rowIndex = table.row(this).index();
            // Data of current row
            var rowData = table.row(this).data();
            // Index value of row (artifical because it's ours) - also tempval
            var artificalIndex = ~~rowData[0];
            /*
             * If we're on the bottom row of the table and the direction of travel is downwards  or if we're
             * on the top row and the direction of travel is upwards then we need to just swap the top and
             * bottom rows
             */
            if(
                    (_this.hasClass("swapDown") && artificalIndex === tableRows)
                    ||
                    (_this.hasClass("swapUp") && artificalIndex === 0)
            ){
                var topIndex, bottomIndex;
                table.rows().every(function(rowIdx, tableLoop, rowLoop) {
                    var data = this.data();
                    if(~~data[0] === 0){
                        topIndex = rowIdx;
                    }
                    if(~~data[0] === tableRows){
                        bottomIndex = rowIdx;
                    }
                });
                table.cell(topIndex, 0).data(tableRows);
                table.cell(bottomIndex, 0).data(0);
            }else{
                var movingIndex, tempData;
                table.rows().every(function(rowIdx, tableLoop, rowLoop) {
                    var data = this.data();
                    // Moving down
                    if (_this.hasClass("swapDown") && ~~data[0] === artificalIndex + 1) {
                        movingIndex = rowIdx;
                        tempData = data[0];
                    }
                    // Moving up
                    if (_this.hasClass("swapUp") && ~~data[0] === artificalIndex - 1) {
                        movingIndex = rowIdx;
                        tempData = data[0];
                    }
                });
                table.cell(rowIndex, 0).data(tempData);
                table.cell(movingIndex, 0).data(artificalIndex);
            }
            table.draw(false);
        }
    });
});

This is a working JSFiddle

我在索引方面遇到了一些问题,因为我不能100%确定内部索引在draw()之后刷新,因此我决定使用隐藏索引并对其进行排序。这是用于创建表格的HTML:

<div class="container">
    <table cellpadding="0" cellspacing="0" border="0" class="table" id="example">
        <thead>
            <tr>
                <th>Index</th>
                <th>Rendering engine</th>
                <th>Browser</th>
                <th>Platform(s)</th>
                <th>Swap Down</th>
                <th>Swap Up</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <th>0</th>
                <td>Trident</td>
                <td>Internet Explorer 4.0</td>
                <td>Win 95+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>1</th>
                <td>Trident</td>
                <td>Internet Explorer 5.0</td>
                <td>Win 95+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>2</th>
                <td>Trident</td>
                <td>Internet Explorer 5.5</td>
                <td>Win 95+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>3</th>
                <td>Trident</td>
                <td>Internet Explorer 6</td>
                <td>Win 98+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>4</th>
                <td>Trident</td>
                <td>Internet Explorer 7</td>
                <td>Win XP SP2+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>5</th>
                <td>Trident</td>
                <td>AOL browser (AOL desktop)</td>
                <td>Win XP</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>6</th>
                <td>Gecko</td>
                <td>Firefox 1.0</td>
                <td>Win 98+ / OSX.2+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>7</th>
                <td>Gecko</td>
                <td>Firefox 1.5</td>
                <td>Win 98+ / OSX.2+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>8</th>
                <td>Gecko</td>
                <td>Firefox 2.0</td>
                <td>Win 98+ / OSX.2+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>9</th>
                <td>Gecko</td>
                <td>Firefox 3.0</td>
                <td>Win 2k+ / OSX.3+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>10</th>
                <td>Gecko</td>
                <td>Camino 1.0</td>
                <td>OSX.2+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>11</th>
                <td>Gecko</td>
                <td>Camino 1.5</td>
                <td>OSX.3+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>12</th>
                <td>Gecko</td>
                <td>Netscape 7.2</td>
                <td>Win 95+ / Mac OS 8.6-9.2</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>13</th>
                <td>Gecko</td>
                <td>Netscape Browser 8</td>
                <td>Win 98SE+</td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <th>14</th>
                <td>Misc</td>
                <td>Lynx</td>
                <td>Text only</td>
                <td></td>
                <td></td>
            </tr>
        </tbody>
    </table>
</div>

希望有帮助,并且我感谢社区提供有关如何改进的反馈,因为我很确定我错过了什么......?