将新行放在jQuery数据表的特定位置
Put new rows at the specific position of the jQuery datatable
默认
我创建了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>
- 在地图加载/页面加载时,我想将地图设置为当前地理位置,但不想在地图上显示定位图标
- JQuery定位:我可以滚动到正确的位置一次,但不能滚动两次
- 如何在jquerymobile中同时放置两个定位的经纬度位置
- Javascript / 根据一个元素的位置定位另一个元素
- 如何定位“隐藏”的 iframe?(应用程序:链接到嵌入“隐藏的海报图像”嵌入的 Youtube 视频的起始位置)
- 与位置的相对定位:绝对
- 在没有“位置”属性的情况下实现绝对定位,使用边距/填充
- 用于相对于用户在约束内单击的位置定位框的数学公式
- 运行地理位置定位的 js 文件
- 如果定位服务关闭,英特尔 XDK 地理位置将找不到纬度/经度
- 在 iPad 上绝对定位不会将元素设置在所需位置
- 如何使用 jQuery 计算相对定位元素的绝对位置*没有*
- 如果php返回位置头,我如何在jquery ajax中定位页面
- 试着根据父母的位置来定位孩子
- 地理定位api没有给出准确的用户位置
- 定位父元素,使子元素处于完全相同的位置
- 如何在Javascript/Mootools中根据页面上不同对象的位置定位箭头
- 使用javascript查找元素相对于最近相对定位的父元素的位置
- 多个谷歌位置请求功能(药房定位器)
- 点击html5地理定位当前位置,然后减去两点