对json响应使用jquery数据表
Using jquery datatable for the json response
我的json输出低于
[{"param1":"value1","param2":"value2","param3":"value3"},{"param1":"value1","param2":"value2","param3":"value3"}]
我的ajax请求被编码在一个函数中,这样它就可以根据按钮点击进行调用:
function callAjaxRequest()
{
ajaxRequest = $.get('getdata',{ 'parameter1': paramValue1,'parameter2':paramValue2 },function(responseinjson) {
if(responseinjson!=null){
$("#table1").find("tr:gt(0)").remove();
var tablevar = $("#table1");
$.each(responseinjson, function(key,value) {
var rowNew = $("<tr><td><td></td></tr>");
rowNew.children().eq(0).text(value['param1']);
rowNew.children().eq(1).text(value['param2']);
rowNew.appendTo(tablevar);
});
var numberofrecords = responseinjson.length;
}
}
}
我将ajax请求初始化为变量,因为在某些情况下我可以稍后中止它。
现在我的问题是,基于大量的记录,我可以在for每个循环中看到很多延迟。所以,有人能建议我如何使用jquery中的datatable根据responseinjson
值实现分页吗。我在互联网上看到了很多例子,但我无法根据收到的回复来思考如何使用。请对我的问题轻描淡写,如果这听起来很无聊,因为我是网络开发的新手。
附言:我不想使用for每个循环添加到数据表中,因为它会导致与我现在相同的延迟。
重申我对赏金的看法:根据我的代码片段,我在ajax调用中得到了整个json响应。但我发现显示数据需要相当长的延迟,因此显示数据的for each jquery循环花费了太多时间。那么,我是否可以在不跳过整个json响应的情况下对其进行分页呢。
Datatables具有内置的分页功能,但使用服务器端数据源意味着您可以在服务器代码中处理分页。
数据表初始化:
var oTable = $('#mytable').dataTable({
'bServerSide': true,
'iDisplayLength': 25,
'iDeferLoading': 0,
'sAjaxSource': 'your-url-that-returns-json',
'bProcessing': true,
'aoColumns': [
{
//...
}
]
});
请注意iDeferLoading
的使用,它可以防止页面加载时的初始填充;使用.fnDraw();
以便在单击按钮时加载。
当您发出请求时,与分页、搜索、排序等相关的参数,相应的值也会传递到查询字符串中,并可在查询数据时使用。
例如在C#中:
public ActionResult PopulateMyTable(jQueryDataTableParamModel param)
{
var mydata = query the database
var results = mydata.Skip(param.iDisplayStart).Take(param.iDisplayLength);
// ...
}
jQueryDataTableParamModel
只是一个包含所有数据表参数的类。
iDisplayStart
&iDisplayLength
是在填充数据表的请求中传递的参数,用于返回分页数据。
然后,返回json数据:
return Json(new {
param.sEcho,
iTotalRecords = rowCount,
iTotalDisplayRecords = rowCount,
aaData = results
}, JsonRequestBehavior.AllowGet
);
请参阅以下代码,用于Ajax和Datatable
$(document).ready(function() {
$('#example').dataTable( {
"processing": true,
"serverSide": true,
"ajax":{
"url" : "../server_side/scripts/server_processing.php",
"data":{
//your variable
}
}
} );
} );
请参阅此处的链接Datatable
您可以这样做(语法也取决于插件版本!):
1) 声明一个管理您的请求的函数(检查语法,我使用自定义实用程序,但这并不完全是我代码中的内容),它是可重用的:var fnServerData=函数(sSource、aoData、fnCallback、oSettings){var jqXHR=$.ajax({dataType:'json',url:s源,data:aoData,成功:fnCallback});oSettings.jqXHR=jqXHR;返回jqXHR;};
2) 在数据表声明中引用它,例如:
$('#example').dataTable({"bPaginate":true,"bServerSide":true,"iDisplayLength":10,"iDisplayStart":0,"sAjaxSource":"yoursource","fnServerData":fnServerData});
如果您对构建DOM元素所需的时间有问题,我建议您查看构建行和单元格元素的方式对性能的影响。
看看这个JSFiddlehttp://jsfiddle.net/e4oc2jbj/。在我的浏览器上,使用基于jQuery的代码需要200毫秒才能添加1000行,而使用原生DOM方法需要大约7毫秒的
var newRow = table.insertRow(0);
var newCell = newRow.insertCell(0);
newCell.appendChild(document.createTextNode(value['param1']));
newCell.appendChild(document.createTextNode(value['param2']));
也许有了更好的性能,您就不需要分页数据了?
您可以包含此分页插件来实现数据表中的分页:
http://www.datatables.net/plug-ins/pagination/
除了像@Sam Greendhalgh提到的那样创建DOM元素外,还可以考虑在"内存"中创建一个表,而不是从DOM中获取一个表并将行附加到它。
我已经测试了您的代码,可以看出问题可能是您将元素直接附加到DOM中。
即:
$("#myTable").find("tr:gt(0)").remove();
var tablevar = $("#myTable");
for(var i=1;i<=100;i++){
var rowNew = $("<tr><td><td></td></tr>");
rowNew.children().eq(0).text("hola");
rowNew.children().eq(1).text("hola");
rowNew.appendTo(tablevar);
}
上面的代码将直接创建/渲染行并将其附加到DOM中,这对于任何浏览器来说都是非常昂贵的性能,在您的情况下,我们谈论的是14k行。
因此,除了关于创建行的本地方法的建议外,您还应该考虑(这可能有帮助,但不确定)在内存中创建的前一个元素中创建整个表(请参阅以下答案:如何使用createElement创建新表?或在StackOverflow中搜索其他表。)
然后将整个表附加到DOM中,并根据页面大小呈现/显示行,而不是显示整个表。
它可以帮助您当前代码的另一件事是将表设置为隐藏(这可能会有所帮助,再次不确定):var tablevar=$("#myTable").hide();
希望我的回答能对你有所帮助,但如果没有,你总是可以避免发明轮子:http://www.datatables.net/
关于:
不管怎样,我可以在不跳过整个json响应。
试试JSON.parse,你可以尝试一些设计,比如:
var myjsobj = JSON.parse('[{"param1":"value111","param2":"value222","param3":"value333"},{"param1":"value1","param2":"value2","param3":"value3"}]');
//now you could acess to your object using an index
console.log(myJsObj[0]); //so "just" left to implement the pagination logic
你需要在json对象中为它添加一个索引,这样你就可以保持的当前位置
我的方法是遍历循环,并在中调用循环中的所有内容
document.setTimeout(function(){}, 0)
这样,所有内容都会被推送到队列中,并且不会阻止用户界面上的交互,因为渲染队列仍然可以在循环之间推送其渲染。。
基本上,它不会垃圾邮件你的堆栈,只是在有时间的时候把它关掉。
我希望你考虑一下我的答案。它在模拟任务中也对我有效;)
- 用程序搜索JQuery数据表中的文本
- jquery数据表的自定义ko绑定
- jquery数据表在初始化时设置宽度
- 如何通过下拉值更改来更改jquery数据表的值
- 来自应用程序状态的Jquery数据表源
- 如何根据某些条件向可编辑的jquery数据表添加或删除按钮
- 如何在不使用TableTool的情况下从jquery数据表中获取选定的行索引
- Jquery 数据表选择位于第 1 页以外的其他页上的行
- jQuery 数据表 在页面上导航时,在分页表上重置行的数据
- 如果我在页面之间移动,Jquery 数据表行事件会卡住
- 引导程序 3 折叠面板中的 Jquery 数据表响应插件
- 为什么不允许在jquery数据表服务器端处理ajax中使用成功
- 对 jQuery 数据表中的所有选定行求和
- 使用jquery数据表,我可以't在不破坏FixedHead的情况下生成单元格colspan=3
- 扩展详细信息Jquery数据表的持久性
- jquery数据表显示/隐藏列添加了错误的选择
- 如何暂停和重新启动jquery数据表插件
- jquery数据表滚动条定位
- Jquery 数据表 序列化程序之后 ASP.NET 日期格式
- 具有三色行的Jquery数据表