为多个元素分页?

问题描述:

让我们说我有一个这样的表:为多个<tbody>元素分页?

<table> 
    <thead> 
     <tr><th>Customer</th><th>Order</th><th>Month</th></tr> 
    </thead> 
    <tbody> 
     <tr><td>Customer 1</td><td>#1</td><td>January</td></tr> 
     <tr><td>Customer 1</td><td>#2</td><td>April</td></tr> 
     <tr><td>Customer 1</td><td>#3</td><td>March</td></tr> 
    </tbody> 
    <tbody> 
     <tr><td>Customer 2</td><td>#1</td><td>January</td></tr> 
     <tr><td>Customer 2</td><td>#2</td><td>April</td></tr> 
     <tr><td>Customer 2</td><td>#3</td><td>March</td></tr> 
    </tbody> 
    <tbody> 
     <tr><td>Customer 3</td><td>#1</td><td>January</td></tr> 
     <tr><td>Customer 3</td><td>#2</td><td>April</td></tr> 
     <tr><td>Customer 3</td><td>#3</td><td>March</td></tr> 
    </tbody> 
    .... 
    .... 1000s of records like this 
</table> 

有没有一种方法可以让我PAGINATE基于tbody元素?例如,我想显示第1页上的前50条记录等等。有没有这样做的jQuery插件,或者我应该写我自己的?有什么建议么?

+3

使用JavaScript与1000个元素在页面上处理是_overkill_,为什么不能在服务器端做这个? – undefined 2013-03-04 19:49:49

+0

我不知道该结构的具体分页标签。亲自编写它不应该太难。数学很容易,jQuery使选择/显示/隐藏琐碎。约3小时的工作经过充分测试。 – 2013-03-04 19:51:05

+1

http://datatables.net有分页选项。 – Blazemonger 2013-03-04 19:52:16

传说,

jQuery Pagination Plugin - - 尼斯找到。

这里有一种方法可以使用这个插件来更加接近你最初的要求。

$(document).ready(function() { 
    var $tbodies = $("#myTable tbody"); 

    // Create pagination element with options from form 
    var paginationOpts = { 
     callback: pageselectCallback, 
     items_per_page: 5, 
     num_display_entries: 10, 
     num_edge_entries: 2, 
     prev_text: "Prev", 
     next_text: "Next" 
    }; 

    function pageselectCallback(page_index, jq) { 
     //calculate limits of the page in terms of tbody indices 
     var limits = { 
      start: page_index * paginationOpts.items_per_page, 
      end: (page_index + 1) * paginationOpts.items_per_page 
     }; 
     $tbodies.filter(":visible").hide(); 
     $tbodies.slice(limits.start, limits.end).show(); 
     // Prevent click eventpropagation 
     return false; 
    } 

    $("#Pagination").pagination($tbodies.length, paginationOpts); 
}); 

我不是说这样比较好。对于1000多个tbody,HTML可能非常庞大,页面转换可能非常缓慢,但如果您尚未修改数据的传输方式,这种方法可以为您节省开发时间。

将来可能对某人有用。

Demo

+0

+1谢谢你的时间。出于某种原因,我无法访问链接?另外,在我的方法中,我不是一次构建整个HTML,而是取决于正在查看的页面视图。另外,我同意你的评论。其缺乏远见 - 我应该在服务器端实施分页。经验教训:) – Legend 2013-03-05 00:02:35

+0

图例是,您的页面将通过以JavaScript形式提供的数据而不是完全形成的HTML来缩小。 FWIW,我纠正了小提琴的链接。 – 2013-03-05 00:17:14

最有效的方法是实现分页服务器端。

正如在评论中所说,Datatables似乎是你走的最佳方式。 我也可能会考虑SlickGrid

请注意,你有选择的客户端或服务器端分页使用这些API

+0

谢谢。我唯一担心的是,这些似乎对于常规表格(一个带有多个“tr”标签的'tbody'标签)来说是非常有用的。然而,在我的使用案例中,我有一个自定义布局,而且我不了解如何针对我的使用情况调整这些插件。你有什么建议吗? – Legend 2013-03-04 20:10:24

+0

本页似乎回答您的问题:[http://datatables.net/release-datatables/examples/advanced_init/row_grouping.html](http://datatables.net/release-datatables/examples/advanced_init/row_grouping.html )。您可以重写fnDrawCallback来为每个组创建一个新的tbody标记。 – Jako 2013-03-04 20:28:46

我得到这个通过轻量工作插件叫做jQuery Pagination Plugin

这里是一个demo如果任何人有兴趣。

HTML:

<div id="Pagination" class="pagination"></div> 
<br style="clear:both" /> 
<table id="Searchresult"></table> 

JS:

var members = [ 
    // Any data array 
]; 

var n = ""; 
function pageselectCallback(page_index, jq) { 
    // Get number of elements per pagionation page from form 
    var items_per_page = 5; 
    var max_elem = Math.min((page_index + 1) * items_per_page, members.length); 
    var newcontent = ''; 

    // Iterate through a selection of the content and build an HTML string 
    newcontent = "<table>"; 
    for (var i = page_index * items_per_page; i < max_elem; i++) { 
     newcontent += '<tbody><tr><td>' + members[i][0] + '</td></tr>'; 
     newcontent += '<tr><td class="state">' + members[i][2] + '</td>'; 
     newcontent += '<td class="party">' + members[i][3] + '</td></tr></tbody>'; 
    } 
    newcontent += "</table>"; 

    // Replace old content with new content 
    $('#Searchresult').html(newcontent); 

    // Prevent click eventpropagation 
    return false; 
} 

$(document).ready(function() { 
    // Create pagination element with options from form 
    var opt = { 
     callback: pageselectCallback 
    }; 
    opt.items_per_page = 5; 
    opt.num_display_entries = 10; 
    opt.num_edge_entries = 2; 
    opt.prev_text = "Prev"; 
    opt.next_text = "Next"; 

    $("#Pagination").pagination(members.length, opt); 
});