Datatables使用之增加序号(1.10新版实现)

以前用EasyUI的,但是最近想做前端的表格,找到了JQuery的Datatables插件,非常不错。

本来以为给表格加一个序号很简单,可是看了Datatables的官方实现看似代码也不简单,测试发现了一些问题,用的不爽。网络上并没有搜索到好的解决方案,就跟踪代码,自己找到了一种方法,本文在最后就给出了这种实现。

1、版本问题

最新的版本1.10,和以前版本做了很大的调整,但是也部分兼容老版本Api的使用。不过官网给出的例子都是新版的使用方式。

新老版本对照表,可以参照 http://dt.thxopen.com/upgrade/1.10-convert.html

2、表格增加序号列(官方)

官网提供了一个例子 http://www.datatables.net/examples/api/counter_columns.html

测试页如下

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>databases测试页</title>
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/dataTables.bootstrap.min.css" />
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="js/dataTables.bootstrap.min.js"></script>
<script>
    var gTable = null;
    function initData() {
        if (gTable) {
            gTable.destroy();//api
        }
        gTable = $(‘#tables‘).DataTable({
            "ordering" : true,//options,它是强于列的控制,所以这里开放,列上进制
            "searching" : false,
            "serverSide" : true,
            "language" : {
                "sProcessing" : "处理中...",
                "sLengthMenu" : "显示 _MENU_ 项结果",
                "sZeroRecords" : "没有匹配结果",
                "sInfo" : "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
                "sInfoEmpty" : "显示第 0 至 0 项结果,共 0 项",
                "sInfoFiltered" : "(由 _MAX_ 项结果过滤)",
                "sInfoPostFix" : "",
                "sSearch" : "搜索:",
                "sUrl" : "",
                "sEmptyTable" : "表中数据为空",
                "sLoadingRecords" : "载入中...",
                "sInfoThousands" : ",",
                "oPaginate" : {
                    "sFirst" : "首页",
                    "sPrevious" : "上页",
                    "sNext" : "下页",
                    "sLast" : "末页"
                },
                "oAria" : {
                    "sSortAscending" : ": 以升序排列此列",
                    "sSortDescending" : ": 以降序排列此列"
                }
            },
            "ajaxSource" : "books.json",
            "columns" : [ {
                // 序号列,如果不给data就会提示
                width : ‘40px‘
            }, {
                "data" : "imgUrl",
                "width" : ‘150px‘,
                "render" : function(data, type, row, meta) {
                    if (data)
                        return ‘<img src="‘+data+‘">‘;
                    else
                        return ‘‘;
                }
            }, {
                "data" : "title",
                "width" : ‘150px‘
            }, {
                "data" : "author",
                "width" : ‘150px‘
            }, {
                "data" : "publisher",
                "width" : ‘125px‘
            }, {
                "data" : "pubDate",
                "width" : ‘100px‘
            } ],
            "columnDefs" : [ {
                "searchable" : false,
                "orderable" : false,
                "targets" : [ 0, 1, 2, 3, 4, 5 ]
            } ],
            "order" : [ [ 2, ‘asc‘ ] ]
        });
        gTable.on(‘order.dt search.dt‘, function() {
            gTable.column(0, {
                search : ‘applied‘,
                order : ‘applied‘
            }).nodes().each(function(cell, i) {
                cell.innerHTML = i + 1;
            });
        }).draw();
    }
    $(function() {
        initData();
    });
</script>
</head>
<body class="easyui-layout">
    <div class="container">
        <h1 class="page-header">
            <span class="glyphicon glyphicon-search"></span> 图书信息
        </h1>
    </div>
    <div id="infoShow" class="container">
        <h3>图书信息</h3>
        <div class="row">
            <table id="tables"
                class="table table-striped table-bordered table-hover">
                <thead>
                    <tr>
                        <th>序号</th>
                        <th>图片</th>
                        <th>名称</th>
                        <th>作者</th>
                        <th>出版社</th>
                        <th>出版日期</th>
                    </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        </div>
    </div>
    <div style="height: 50px;"></div>
</body>
</html>

测试效果如下

总是会提示一个有一个错误

问题的说明 https://datatables.net/manual/tech-notes/4。但是这个说明不能提供任何帮助。

点击这个确定按钮后,出现下面的列表。

上图,序号列没有值,其实下了断点知道,draw()执行的时机比较早,会被column的data数据null刷掉。

官方的例子没有给出更多信息,而且我觉得上面的代码实现很复杂,而且资料少,我也不知道提示如何消除,而且是否值得花时间解决呢。

总之,最后成功的刷出第一页的序号列,但是第二页、第N页失败。我是动态从后端返回json数据。

3、data实现(方便,非官方实现)

自己动手丰衣足食啊,既然column的data可以是一个函数,那么就看看参数中的数据。结果确实发现了一些有用的数据,开始动手。

代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>databases测试页</title>
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/dataTables.bootstrap.min.css" />
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="js/dataTables.bootstrap.min.js"></script>
<script>
    var gTable = null;
    function initData() {
        if (gTable) {
            gTable.destroy();//api
        }
        gTable = $(‘#tables‘).DataTable({
            "ordering" : true,//options,它是强于列的控制,所以这里开放,列上进制
            "searching" : false,
            "serverSide" : true,
            "language" : {
                "sProcessing" : "处理中...",
                "sLengthMenu" : "显示 _MENU_ 项结果",
                "sZeroRecords" : "没有匹配结果",
                "sInfo" : "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
                "sInfoEmpty" : "显示第 0 至 0 项结果,共 0 项",
                "sInfoFiltered" : "(由 _MAX_ 项结果过滤)",
                "sInfoPostFix" : "",
                "sSearch" : "搜索:",
                "sUrl" : "",
                "sEmptyTable" : "表中数据为空",
                "sLoadingRecords" : "载入中...",
                "sInfoThousands" : ",",
                "oPaginate" : {
                    "sFirst" : "首页",
                    "sPrevious" : "上页",
                    "sNext" : "下页",
                    "sLast" : "末页"
                },
                "oAria" : {
                    "sSortAscending" : ": 以升序排列此列",
                    "sSortDescending" : ": 以降序排列此列"
                }
            },
            "ajaxSource" : "books.json",
            "columns" : [ {
                width : ‘40px‘,
                data : function(row, type, set, meta) {
                    var c = meta.settings._iDisplayStart + meta.row + 1;
                    return c;
                }
            }, {
                "data" : "imgUrl",
                "width" : ‘150px‘,
                "render" : function(data, type, row, meta) {
                    if (data)
                        return ‘<img src="‘+data+‘">‘;
                    else
                        return ‘‘;
                }
            }, {
                "data" : "title",
                "width" : ‘150px‘
            }, {
                "data" : "author",
                "width" : ‘150px‘
            }, {
                "data" : "publisher",
                "width" : ‘125px‘
            }, {
                "data" : "pubDate",
                "width" : ‘100px‘
            } ],
            "columnDefs" : [ {
                "searchable" : false,
                "orderable" : false,
                "targets" : [ 0, 1, 2, 3, 4, 5 ]
            } ],
            "order" : [ [ 0, ‘asc‘ ] ]
        });
    }
    $(function() {
        initData();
    });
</script>
</head>
<body class="easyui-layout">
    <div class="container">
        <h1 class="page-header">
            <span class="glyphicon glyphicon-search"></span> 图书信息
        </h1>
    </div>
    <div id="infoShow" class="container">
        <div class="row">
            <table id="tables"
                class="table table-striped table-bordered table-hover">
                <thead>
                    <tr>
                        <th>序号</th>
                        <th>图片</th>
                        <th>名称</th>
                        <th>作者</th>
                        <th>出版社</th>
                        <th>出版日期</th>
                    </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        </div>
    </div>
    <div style="height: 50px;"></div>
</body>
</html>

重点就是下面这一句

meta.settings._iDisplayStart + meta.row + 1;

经过分析得知:

meta.settings._iDisplayStart 每一次显示的记录的起始索引;

meta.row+1 是当前页的行索引,加1就是行号;

两者相加,就是当期的行序号。

这个方法,不是官方提供或推荐的方法,但是在data中处理好显示的数据,我觉得更加的直观,而且代价更小。

也许使用老版本的datatables的朋友有更绝的方法,可以提供给我学习,但是我没有搜索到。但是从代码量上来看,我的实现简单易用。

看效果

4、最后

Datatables我是初次尝试,而且一上来就用了1.10新版,网上大把的旧版实现例子,但是就是想试一试新版是否可以更加的方便。

希望能帮助到需要的朋友,抛砖引玉最好。

时间: 2024-08-10 00:07:44

Datatables使用之增加序号(1.10新版实现)的相关文章

C# WinForm DataGridView 给标题列增加序号及格式化某个字段

DataGridView 给标题列增加序号 private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { DataGridViewTextBoxColumn dgv_Text = new DataGridViewTextBoxColumn(); for (int i = 0; i < dataGridView1.Rows.Count; i++) { i

(转)Repeater中增加序号自增列

<%# Convert.ToString(Container.ItemIndex+1)%> 当Repeater空为时,提示没有数据... <FooterTemplate> <tr style="color:Red; font-size:18px;" runat="server" Visible="<%#rpt.Items.Count==0 %>" > <td colspan="8&q

cxGrid 增加序号 (非数据库绑定模式) (测试通过)

cxGrid 增加序号 (非数据库绑定模式) ----------------------------------- 1. 选在 adoQuery 控件 , 鼠标右键菜单中 选择 Fields Editor 2. 在  adoQuery 控件 Fields Editor 中 鼠标右键菜单  (1)  Add all fields (2)  New field  --->  Name ==>     curRowNo                         Type    ==>

mysql 排序并增加序号,分数相同并列

1,排序,根据总分 增加序号 表结构: sql: SET @row=0; SELECT b.*, @row:[email protected]+1 rownum FROM ( select *,SUM(a.achievement) as achievementAll from cp_cj as a where 1=1 GROUP BY a.studentNum order by SUM(a.achievement) DESC limit 0,30 ) as b 结果: 2,排序,根据总分 增加序

DataTables中自增序号的实现

最近工作中,一直在写前端的东西,一直以来前端都接触的少,所以侧重点也没放在这边,导致现在工作进展比较慢,果然偷懒是要不得的啊.... 今天刚写了一个在DataTables中增加一列自增序号,刚开始以为要写循环自增,后来发现只需要在ColumnDefs中对应的列下返回自增序号即可 代码如下: render:function(data, type, row, meta){ return meta.row + 1 + meta.settings._iDisplayStart; } 原文地址:https

增加序号列 - DataSet

开发环境:VS2010 数据库:MySQL V5.5.42 连接器:Connector.NET V6.9 1. 新建工程(Windows Application) 2. 增加引用(MySql.Data) 3. 放置控件 1个TextBox,1个DataGrideView等等 4. 查询按钮事件 private void btnSearch_Click(object sender, EventArgs e) { string connStr = string.Format( "server={0}

4-4 链式表的按序号查找 (10分)

本题要求实现一个函数,找到并返回链式表的第K个元素. 函数接口定义: ElementType FindKth( List L, int K ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; L是给定单链表,函数FindKth要返回链式表的第K个元素.如果该元素不存在,则返回ERROR. 裁判

SQL查询结果增加序号列

--sql 2000 select 序号 = (select count(1) from tb where 学号 < t.学号) + 1,学号 ,姓名 from tb t --sql 2005 select 序号 = row_number() over(order by 学号),学号 ,姓名 from tb --oracle select row_number() over(order by 学号) 序号,学号 ,姓名 from tb

CSS计数器:给列表自动增加序号【2】

多层嵌套的列表本质上还是单层列表的组合.再复杂的层级,都是由一个个父子关系的双层层级组成的.只要每一个最基本的父子关系层级不乱,组成的更复杂的结构就不会乱. 重点是: 1.上下级关系一定要明确,父子关系就是父子关系,兄弟关系就是兄弟关系. 2.样式的唯一变化是,原来用counter方法,现在要用counters方法,第一个参数是计数器名称,第二个参数是间隔符号. 代码如下: <style> ul{counter-reset:num;padding-left:20px;} li:before{c