jQuery插件DataTables分页开发心得体会


Posted in jQuery onAugust 22, 2017

写Blog目的:不是为人气,只是留份笔记;??虏灰?簦?慌掠幸怕??院笙氩黄鹄础?/p>

官网:https://datatables.net/
中文官网:http://datatables.club/

开发环境:Python 3.6.0、Anaconda 4.3.1、Django、JetBrains PyCharm 2017.1.5

按我项目的开发过程简单整理。

1、第一版本,无分页。

在此之前有用到过DataTables(更多的是easyui中的Datagrid,另之前服务端是PHP),因此想着前端/客户端差异不大,服务端反正都是按规范格式返回JSON串(Django的代码后续再整理)。另外,刚开始也没想着表格分页,只是有三个字段排序需求(排序已在服务端做好并返回)。
DataTables基础代码:

//表格的HTML代码略过
$('#dtList').DataTable({
        "bPaginate": false, //翻页功能
        "bInfo": false,//页脚信息
        "ordering": false, //不排序
        "searching": false,  //搜索框,不显示
        "bLengthChange": false, //改变每页显示数据数量,不显示
        "iDisplayLength": 10,  //每页默认显示数量(不显示了,这个设置也起不了作用)
        "serverSide":true, //服务端
        "retrieve":false, //意思是如果已经初始化了,则继续使用之前的Datatables实例。

        "ajax": {
          "type": "POST",
          "url": "/manage/getlist/",
          "data":{'csrfmiddlewaretoken': '{{ csrf_token }}'}, //Django的token值
          "dataSrc": function (result) { //使用dataSrc属性来设置获取到的数据格式,其值是服务端拼好的key-value(数据字段名称-字段值)【服务端走了弯路,后续有时间再写文章说明】
            var json = JSON.parse(result).data;
            return json;
          }
        },
        "columns": [ //表格要显示的列定义(字段名称做了处理)
          { "data": "field0",
            "visible":false,
            "render": function ( data, type, full, meta ) {
              //return '<input type="checkbox"/>';
              return data;
            }
          },
          { "data": "field1" },
          { "data": "field2" , //此列名要与服务端返回的JSON串中的值一致
            "render": function ( data, type, full, meta ) {
              return '<div style="text-align:left">'+data+'</div>';
            }
          },
          //其余字段定义省略
          ]
        });

2、加上分页功能

第一个程序写好几天后就准备加上分页功能。
DataTables的JSON串格式要求:

{
  "draw": n, 
  "recordsTotal": n, //总记录数
  "recordsFiltered": n, //条件过滤后的记录数,与总记录数可能会不同
  "data": [{}] //获取到的记录集合
}

按照之前处理easyui中Datagrid组件的经验,得到总记录数,筛选后的记录数等值,拼好JSON串回传就行,客户端可以直接实现分页。

可是,问题来了:draw的值怎么控制?

查了资料,也跟踪了下浏览器的header,知道draw是DataTables本身的一个属性值 ,每次获取数据时都会向服务端传,不需要改这个值,直接在JSON串中回传就好。试了下,不知道问题出在哪,好像分页也不行,而且总感觉这种控制方法有点累。

换个思路再查资料,就是服务端分页(按需请求相应数据),还真有:django-datatables-view(datatables for django,https://pypi.python.org/pypi/django-datatables-view),按其安装步骤来就好,这样子就不用考虑JSON串几个值怎么拼的问题了,这个组件会做好。

改进后的前端代码:

$('#dtList').DataTable({
    "bPaginate": true, //翻页功能
    "bInfo": true,//页脚信息
    "ordering":true, //开启排序
    "searching": false, //搜索框,不显示
    "bLengthChange": true, //改变每页显示数据数量,不显示
    "aLengthMenu": [[5, 10, 25, 50, -1], [5, 10, 25, 50, "All"]], //每页显示记录菜单选项
    "iDisplayLength": 10, //每页默认显示数量
    "serverSide":true, //开启服务端请求模式
    'pagingType': 'full_numbers',
    "retrieve":true,

    "ajax": { //这边就不需要dataSrc属性来处理值了
     "type": "GET",
     "url": "{% url 'scheme_list_json' %}",
     "data":{
      'sSearch':'',
      'csrfmiddlewaretoken': '{{ csrf_token }}'},
     },
    "columns": [ //表格要显示的列定义
     { "data": 0,
      "visible":false,
      "render": function ( data, type, full, meta ) {
       //return '<input type="checkbox"/>';
       return data;
      }
     },
     { "data": 1
     "bSortable":false
     },
     { "data": 2,
      "bSortable":false, //此字段不排序
      "render": function ( data, type, full, meta ) {
       return '<div style="text-align:left">'+data+'</div>';
      }
     },
     //其余字段定义省略
     ......
     ],
    "aaSorting": [ //指定排序的列(索引从0开始)及规则
     [ 8, "asc" ],
     [ 9, "asc" ],
     [ 10, "desc" ]
     ],
    "drawCallback": function( settings ) { //绘制表格时的回调函数
     $("th").removeClass("sorting_asc"); //删除排序图标,升序样式
     $("th").removeClass("sorting_desc");//降序样式 
   });

排序成功,但问题来了:开启排序功能后,表头行中会有排序的图标,但我们不需要它(只是排序,不需要点击),所以加上上面代码中的drawCallback回调函数,去掉其样式就好。
PS:
有个坑-服务端的回传字段和排序字段的列数一定要一一对应,前端DataTables显示字段columns定义也要按这个顺序来,否则前端排序会乱,如:

# 需要显示的字段
 columns = ['jyjhbid', 'tzbd', 'clsc', 'clzt', 'jlscrq', 'jlxgrq', 'clcz'] 

 # 排序
 order_columns = ['jyjhbid', 'tzbd', 'clsc', 'clzt', 'jlscrq', 'jlxgrq', 'clcz']

刚接触django-datatables-view,以为这两个集合值可以不同,所以。。。。多走了些路。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
详解jquery选择器的原理
Aug 01 jQuery
jQuery实现手势解锁密码特效
Aug 14 jQuery
jQuery Position方法使用和兼容性
Aug 23 jQuery
jQuery实现对网页节点的增删改查功能示例
Sep 18 jQuery
jQuery实现的简单拖拽功能示例【测试可用】
Aug 14 jQuery
jQuery实现参数自定义的文字跑马灯效果
Aug 15 jQuery
jQuery实现鼠标移入移出事件切换功能示例
Sep 06 jQuery
使用jquery的cookie实现登录页记住用户名和密码的方法
Mar 13 jQuery
jQuery实现判断滚动条滚动到document底部的方法分析
Aug 27 jQuery
jQuery实现每日秒杀商品倒计时功能
Sep 06 jQuery
jQuery实现移动端下拉展现新的内容回弹动画
Jun 24 jQuery
jQuery实现广告条滚动效果
Aug 22 #jQuery
基于jQuery的表单填充实例
Aug 22 #jQuery
使用jQuery实现简单的tab框实例
Aug 22 #jQuery
JQuery判断正整数整理小结
Aug 21 #jQuery
jquery动态赋值id与动态取id方法示例
Aug 21 #jQuery
jQuery模拟爆炸倒计时功能实例代码
Aug 21 #jQuery
jQuery实现表格冻结顶栏效果
Aug 20 #jQuery
You might like
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
详解python开发环境搭建
2016/12/16 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
Django分页功能的实现代码详解
2019/07/29 Python
python tkinter实现屏保程序
2019/07/30 Python
python中round函数保留两位小数的方法
2020/12/04 Python
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
办理护照介绍信
2014/01/16 职场文书
大四自我鉴定
2014/02/08 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
中秋节晚会开场白
2015/05/29 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
react 项目中引入图片的几种方式
2021/06/02 Javascript
python常见的占位符总结及用法
2021/07/02 Python