将新行放在jQuery数据表的特定位置

Put new rows at the specific position of the jQuery datatable

本文关键字:定位 位置 数据表 新行放 jQuery      更新时间:2023-09-26

默认
我创建了ajax datatable,这些行有时用json填充在表的末尾:jsfiddle,有时在表的顶部。这取决于ajax响应的时间。

推荐输出
我有两个来自两个不同来源的输入json,输出如下表:

<table>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    ...
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>8</td><td>7</td><td>6</td></tr> <!-- inserted row-->
    <tr><td>8</td><td>7</td><td>6</td></tr> <!-- inserted row-->
    <tr><td>8</td><td>7</td><td>6</td></tr> <!-- inserted row-->
    <tr><td>8</td><td>7</td><td>6</td></tr> <!-- inserted row-->
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    ...
    <tr><td>1</td><td>2</td><td>3</td></tr>
</table>

第2行。json插入到表中(从1创建。json(到特定位置。这个位置是恒定的,长度为1。和2。json数据是常量。

第一个解决方案
我必须添加包含数字的第一列,并按数字降序对数据表进行排序-jsfiddle。我可以隐藏第一列的jsfiddle,但我更喜欢使用自定义函数,因为它在IE8中不起作用。

var t = $("#tab1").DataTable({
    "ajax": "data1.json",
    columnDefs: [
         { className: "hide", "targets": [ 0 ] },
         ], 
    "columns": [
        { "data": "id"},
        { "data": "cat1"},
        { "data": "cat2"},
        { "data": "cat3"}
    ]
});
$.ajax({
    type: "GET",
    url: "data2.json",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (response) {
        t.rows.add(response.data); 
        t.draw();
    }
  });

理念-自定义功能
我尝试创建自定义函数rows.addinposition(rows, position),但它与函数rows.add()一样工作
我复制并修改了jquery.dataTables.js中7879行的函数rows.add,我将out.push()更改为out.splice()拼接文档。

我知道,这是不推荐的,最好是扩展数据表api。。。

_api_register( 'rows.addinposition()', function ( rows, position ) {
    var newRows = this.iterator( 'table', function ( settings ) {
            var row, i, ien;
            var out = [];
            for ( i=0, ien=rows.length ; i<ien ; i++ ) {
                row = rows[i];
                if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
                    //ROWS.ADD USE OUT.PUSH
                    //out.push( _fnAddTr( settings, row )[0] );
                    //CHANGED TO OUT.SPLICE
                    out.splice( position, 0, _fnAddTr( settings, row )[0] );
                }
                else {
                    out.splice( position, 0, _fnAddData( settings, row ) );
                }
            }
            console.log(out);
            return out;
        }, 1 );
    // Return an Api.rows() extended instance, so rows().nodes() etc can be used
    var modRows = this.rows( -1 );
    modRows.pop();
    modRows.push.apply( modRows, newRows.toArray() );
    return modRows;
} );    

如果你能帮我就太好了。

我发现了类似的问题:

  • SO链接:1.9版数据表中的函数fnAddData()
  • SO链接-将多行添加到数据表末尾
  • SO链接-无应答
  • datatables论坛链接-旧版本,没有答案(我认为(

编辑
谢谢你davidkonrad,但我在jsfiddle中测试了它,我发现了2个问题:

  • 排序错误2.,1.,而不是1.,2.-我认为问题很简单
  • 有时这些添加的行在表的顶部,有时在正确的位置。随机。-也许是个大问题

我在jsfiddle中调试它,它的行为非常奇怪:

console.log('rowCount = '+rowCount);

如果行在顶部(错误位置(返回:

rowCount = 0
rowCount = 1

for没有循环,因为firebug没有显示var i

如果他们处于良好位置,返回:

rowCount = 5
rowCount = 6

在本例中,for循环,var i返回:
1.回路:

i = 5 
i = 4 
i = 3

2.回路:

i = 6 
i = 5 
i = 4 
i = 3

我错过什么了吗?为什么秩序很奇怪?

您不需要直接修改源代码,而是使用dataTable.Api.register

jQuery.fn.dataTable.Api.register('row.addByPos()', function(data, index) {     
    var currentPage = this.page();
    //insert the row  
    this.row.add(data);
    //move added row to desired index
    var rowCount = this.data().length-1,
        insertedRow = this.row(rowCount).data(),
        tempRow;
    for (var i=rowCount;i>=index;i--) {
        tempRow = this.row(i-1).data();
        this.row(i).data(tempRow);
        this.row(i-1).data(insertedRow);
    }     
    //refresh the current page
    this.page(currentPage).draw(false);
});

上面的函数(或插件(插入行,然后通过交换内容将行"移动"到所需位置->阅读更多详细解释
演示->http://jsfiddle.net/p4wcfzfe/

由于该插件向通用API添加了一个函数,因此应在使用该函数的任何dataTable的初始化之前声明该插件

{ plugin declaration }
var table = $("#example").DataTable();
table.row.addByPos([data], 1);

注意:你的"第一个解决方案"也应该在IE8中工作,试着去掉后面的逗号。

解决方案

我认为当两个Ajax调用都成功时,您需要使用jQuery $.when函数来执行回调。

通过这种方式,您总是以相同的顺序获得数据,并且不需要编写函数在特定位置插入数据。

此外,如果需要,您可以在初始化数据表之前操作最终数据。例如,下面显示的只是两个选项,可能性是无限的。

call2的数据附加到call1的数据:

var data = a1[0].data.concat(a2[0].data);

call1数据的2位置插入call2数据(来源(:

var data = a1[0].data;
data.splice.apply(data, [2, 0].concat(a2[0].data));

演示

有关代码和演示,请参阅下面的示例。

$(document).ready(function(){
   var call1 = $.ajax({
      url: "https://api.myjson.com/bins/48g56",
      type: "GET",
      dataType: "json",
      contentType: "application/json; charset=utf-8",
   });
   var call2 = $.ajax({
      url: "https://api.myjson.com/bins/1bfa2",
      type: "GET",
      dataType: "json",
      contentType: "application/json; charset=utf-8",
   });
   
   
   // When both Ajax requests were successful
   $.when(call1, call2).done(function(a1, a2){
      // a1 and a2 are arguments resolved for the call1 and call2 ajax requests, respectively.
      // Each argument is an array with the following structure: [ data, statusText, jqXHR ]
     
      // Append data from call2 to data from call1
      // var data = a1[0].data.concat(a2[0].data);
     
      // Insert data from call2 at position 2 of data from call1
      var data = a1[0].data;
      data.splice.apply(data, [2, 0].concat(a2[0].data));
     
      // Initialize data table
      var t = $("#tab1").DataTable({
         data: data,
         columnDefs: [
            { className: "hide", "targets": [ 0 ] },
         ], 
         order: [],
         ordering: false,        
         columns: [
            { "data": "id"},
            { "data": "cat1"},
            { "data": "cat2"},
            { "data": "cat3"}
         ]
      });
   });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://cdn.datatables.net/1.10.7/js/jquery.dataTables.js"></script>
<link href="http://cdn.datatables.net/1.10.7/css/jquery.dataTables.css" rel="stylesheet"/>
<table id="tab1" class='data tab01'>
	<thead>
		<tr>
 			<th>id</th>
            <th>cat1</th>
			<th>cat2</th>
			<th>cat3</th>
		</tr>
	</thead>
	<tbody>
	</tbody>
</table>