Datatables 表格插件

JS 插件文档库邀你一起协同创作 - 简书

Datatables

这是我见过最强大的在线表格插件了,官方文档也比较完整,建议直接看英文版本,初次看可能会有点逻辑混乱,但是多看看,每次都有一些收获。这里我还是通过示例的方式,来介绍一下数据获取以及参数传递的方式。

1. 准备

相比Bootstrap-Table,Datatables的前台页面中需要定义表格的表头,否则将无法显示,代码如下:

<table id="table" class="table table-bordered table-striped">
  <thead>
    <tr>
      <th></th>
      <th>ID</th>
      <th>Item name</th>
      <th>Item price</th>
      <th>列1</th>
      <th>列2</th>
      <th>列3</th>
      <th>列4</th>
      <th>操作</th>
    </tr>
  </thead>
</table>

在前后各多出一列,后面会介绍它的用处。表头定义好后,接下来就是引入库文件了,1个css文件,2个js文件。如下:

<!-- DataTables css -->
<link rel="stylesheet" href="/datatables.net-bs/css/dataTables.bootstrap.min.css">

<!-- DataTables js-->
<script src="/datatables.net/js/jquery.dataTables.min.js"></script>
<script src="/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>

js文件依然还是放到最底下,</body>之前即可,引入正确的库文件之后,准备工作就OK了。

2. 初步使用

Datatables提供了4种获取表格数据的方式,这里只介绍:通过Ajax异步获取的方式。数据格式依然还是包含数据对象的数组,而且跟之前是同一组数据,看下初步效果:

image.png

同样的配方,不一样的味道,js中代码实现如下:

$('#table').DataTable({
    ajax: {
        url: '/json/data.json',
        dataSrc: ''
    },
    columns: [
        { "data": null , defaultContent: '' },
        { "data": "id" },
        { "data": "name"},
        { "data": "price"},
        { "data": "column1" },
        { 'data': "column2" },
        { "data": "column3" },
        { "data": "column4" },
        { "data": null , defaultContent: ''}
    ]
});

这里需要注意的是:

  1. columns 参数中数组的对象数量,一定要跟前台表格中th保持一致,否则无法渲染出来。
  2. 由于示例中,返回的是包含对象的数组类型,于是需要设置dataSrc为空,否则也无法得到数据。Datatables提供多种返回数据格式,具体参照这里Ajax sourced data

3. 功能介绍

由于Datatables的功能实在太多了,这里也不可能全部介绍到,根据实际项目经验,主要介绍一些比较实用,或者跟Bootstrap-Table有差异性的一些功能点。

(1)操作区

还记得上面表格页面预留的两列吧,想必你也猜出来了,最右边的那列,就是用来放操作按钮的,我们添加一个表格参数columnDefs用来定义列。

columnDefs: [
  {
        targets: -1,
        visible: false,
        sortable: false,
        render: function(data, type, row){
            return '<a href="#" title="详情">' + 
            '<i class="glyphicon glyphicon-eye-open"></i> ' + 
            '</a>'+ 
            '<a href="#editProject" data-toggle="modal" data-id="' + row.p_id +'" title="修改">' + 
            '<i class="glyphicon glyphicon-pencil"></i> ' + 
            '</a>'+
            '<a href="#delProject" data-toggle="modal" data-id="' + row.p_id +'" title="删除">' +
            '<i class="glyphicon glyphicon-trash text-danger"></i> ' + 
            '</a>';
        }
    }
],

targets选择目标列,-1代表倒数第1列,render渲染的样式。最后表格效果如下图:

image.png

后面具体的实现方法,就不介绍了,你可以使用modal弹出框,也可以跳转到其他页面。

(2)响应式

在这个移动优先的互联网时代,不适应手机端的页面都不好意思拿出来。DatatablesResponsive扩展,似乎比较优雅的解决了,在线表格在手机端无法完美显示的痛点。

image.png

上面预留的第一列发挥了它的用处,当点击+号时,自动展开隐藏的列,是不是比较优雅的解决了,在线表格在手机端查看的问题。实现方法非常简单,首先引入Responsive扩展的库文件,如下:

<link rel="stylesheet" href="/datatables.net-responsive-bs/css/responsive.bootstrap.min.css">

<!-- datatables responsive -->
<script src="/datatables.net-responsive/js/dataTables.responsive.min.js"></script>
<script src="/datatables.net-responsive-bs/js/responsive.bootstrap.min.js"></script>

在表格参数中加入responsive: true即可,当屏幕尺寸渐渐缩小的时候,后面的列就会自动隐藏到+号里面。那么能不能定义优先级,让我去定义哪些列优先隐藏,哪些列后隐藏。当然可以,在columns中定义responsivePriority属性即可。如下:

columns: [
    { "data": null, sortable: false, defaultContent: '' , responsivePriority:  2},
    { "data": "id" },
    { "data": "name", responsivePriority:  1},
    { "data": "price" , responsivePriority:  3},
    { "data": "column1" },
    { 'data': "column2" },
    { "data": "column3" },
    { "data": "column4" },
    { "data": null , defaultContent: '' ,responsivePriority: 4}
],

值越小,显示优先级越高,没有设置值的地方,按照列的先后顺序依次隐藏。

(3)按钮功能

这个是Datatables比较有特色的一个功能,自由度比较高,可以自定义一系列的功能。它是通过Buttons的扩展来实现的,在介绍Buttons之前,需要先了解一下DOM这个参数,也就是表格的布局。

image.png

如上图所示,整个表格页面总共分为了5大块,这5大块分别用一个字母来表示,分别为lftip,这是默认的布局。DOM设置参考:

  • l - Length changing
  • f - Filtering input
  • t - The Table!
  • i - Information
  • p - Pagination
  • < and > - div elements
  • <"#id" and > - div with an id
  • <"class" and > - div with a class
  • <"#id.class" and > - div with an id and class

如果我们要使用Buttons扩展,就需要给它预留一个位置,所以我们要在表格参数中,加上DOM的配置。

简单介绍了下DOM,现在我们引入Buttons的扩展文件,官方文档默认提供了5个功能按钮,需要引入一些第三方库,我都一一标注出来了,如下:

<!-- DataTable buttons -->
<script src="/datatables.net-buttons/js/dataTables.buttons.min.js"></script>
<script src="/datatables.net-buttons-bs/js/buttons.bootstrap.min.js"></script>
<!-- buttons 打印功能 -->
<script src="/datatables.net-buttons/js/buttons.print.min.js"></script>
<!-- buttons 导出功能 -->
<script src="/datatables.net-buttons/js/buttons.html5.min.js"></script>
<script src="/jszip/dist/jszip.min.js"></script>
<!-- buttons 生成PDF功能 -->
<script src="/pdfmake/build/pdfmake.min.js"></script>
<script src="/pdfmake/build/vfs_fonts.js"></script>

库文件引入之后,接下来配置一下DOM参数以及Buttons参数,如下:

dom: '<"pull-left"B>ft<"pull-left"i>p', 
buttons: [
    'copy', 'print', 'excel', 'csv', 'pdf'
],

从上面布局可以看出,Button靠左上,搜索右上,表格中间,信息在左下,分页在右下。效果如下图:

image.png

如果你正确的引入了上述的那些库文件,且dombuttons配置正确,那么不用写一句代码就可以直接拥有:复制,打印,导出excel,导出csv,制作PDF的功能了。

但我并不满足上述的一些功能,我想自定义一些按钮,完全没有问题。假如,我想添加一个刷新按钮,在buttons里添加reload如下:

buttons: [
    'copy', 'print', 'excel', 'csv', 'pdf', 'reload'
]

然后加上reload的定义:

$.fn.dataTable.ext.buttons.reload = {
    text: '<i class="glyphicon glyphicon-refresh"></i>',
    action: function ( e, dt, node, config ) {
        dt.ajax.reload();
    }
};

text为显示的样式,action为执行的操作,dt.ajax.reload()指的是表格刷新。设置完之后,你会发现按钮组那多了一个按钮,如下图:

image.png

你会发现那个图标挺好看的呀,默认的那几个按钮也变成图标就好了,就像下图所示:

image.png

于是修改一下buttons参数如下:

buttons: [
    {
        text: '<i class="glyphicon glyphicon-copy" title="复制"></i>',
        extend: 'copy'
    }, {
        text: '<i class="glyphicon glyphicon-print" title="打印"></i>',
        extend: 'print'
    }, {
        text: '<i class="glyphicon glyphicon-save-file" title="导出excel"></i>',
        extend: 'excel'
    }, {
        text: '<i class="glyphicon glyphicon-list-alt" title="导出csv"></i>',
        extend: 'csv'
    }, {
        text: '<i class="glyphicon glyphicon-file" title="生成pdf"></i>',
        extend: 'pdf'
    }, 'reload'
],

加上title属性,当鼠标停留的时候,可以显示提示文本。结合Buttons扩展,我们可以在表格中实现很多功能。

(4)编辑功能

编辑模块在Datatables中是收费的,其实我们通过「操作区」也是可以实现编辑需求的,这里我再介绍一种具有Datatables特色的编辑功能。编辑不同于其他功能按钮可以独立存在,编辑功能需要先获取到该行的数据,然后才能执行后续操作。

获取行的操作,意味着需要选择某行,这里再引入一个扩展模块Select,导入库文件:

<!-- datatables select  -->
<script src="/datatables.net-select/js/dataTables.select.min.js"></script>
<script src="/datatables.net-select-bs/js/select.bootstrap.min.js"></script>

表格参数中,添加Select的配置,设置为单选:

select: 'single',

结合Buttons模块,再添加一个编辑按钮,上面已经介绍过了,相信你会添加。主要看下编辑按钮的动作。

$.fn.dataTable.ext.buttons.edit = {
    text: '<i class="glyphicon glyphicon-pencil"></i>',
    action: function ( e, dt, node, config ) {
        var rows = dt.rows({ selected: true }); // 获取选中的行
        var selectedCount = rows.count();       // 选中的行数量
        var data = rows.data()[0];              // 得到行数据
        if(selectedCount){
            var selectedId = data.id;
            $('#edit').modal('show');
            $('#edit small').html('编辑项目ID:' + selectedId);
            $('#edit form input[name=name]').val(data.name);
            $('#edit form input[name=price]').val(data.price);
            $('#edit form input[name=column1]').val(data.column1);
            $('#edit form input[name=column2]').val(data.column2);
            $('#edit form input[name=column3]').val(data.column3);
            $('#edit form textarea[name=column4]').val(data.column4);
        }else{
            alert('请选择行再操作');
        }
    }
};

这里有一个判断,选中了行,才能接下来的操作。示例代码就写到这里,实际执行编辑功能,需要结合后台来实现。

好了,Datatables的介绍,我想就讲到这里,这里通过示例,大概介绍了ResponsiveButtonsSelect扩展模块的使用。由于功能实在太多,不可能面面俱到,而且官方文档的介绍已经很详细了,建议没事翻翻文档。

更多Chat...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容