前言

在后台管理系统开发中,难免会出现列数太多的情况,这里提供一个解决方案:用户设置显示哪些列,每个用户互不影响,并且可以根据用户的习惯设置列的排序。

1、演示

2、html代码说明

3、javascript代码说明

4、总结

1、演示

2、HTML代码

 

<link rel="stylesheet" type="text/css" href="DataTables-1.10.15//media/css/jquery.dataTables.css"><script type="text/javascript" language="javascript" src="DataTables-1.10.15/media/js/jquery.js"></script><script type="text/javascript" language="javascript" src="DataTables-1.10.15/media/js/jquery.dataTables.js"></script><table id="page-table" class="table table-bordered table-hover"><thead></thead><tbody></tbody></table>

引入jquery跟DataTables即可,然后再写一个table。

3、javascript代码

 

1、调用

new $.pageSearch({customColumns:{pageId: pageId,// 唯一ID
      pageFieldList:pageFieldList,// dataTables的columns参数写这里
      columns:{column1:{width:200}},// dataTables的aoColumnDefs参数写这里
      aoColumnDefs:{column2:{width:200,mRender: function (data, type, full) {return 'custom ' + data;}}}},DataTable:{// 这里保留了DataTables的参数
      data: dataList}});

customColumns对象是必传的。

customColumns.pageId主要是存取数据用的,保证每一个实例的设置区分开来。

customColumns.pageFieleList是每个实例设置的数据,格式如下:

var pageFieldList = [{display: true,displayName: 'Column1',fieldName: 'column1'}];

customColumns.columns是dataTables的columns,将原来的数组改成了对象,以data为属性名,其他属性保留。

customColumns.aoColumnsDefs跟customColumns.columns同理。

2、pageSearch里面的代码

!(function () {function pageSearch(options){this.table = null;this.options = $.extend({container:'#my-page',//容器settingBtn:'#setting',//容器内的按钮table:'#page-table',//容器内的table
    customColumns:{pageId: '',//(必填)自定义列需要用到的id 必须唯一pageFieldList: [],//(必填)页面字段配置columns: null,//列配置项columnDefaults: null},DataTable:{}//保留dataTables参数
    },options);this.main();}$.extend(pageSearch.prototype,{main:function(){this.renderThead();this.setDefault();this.initTable();this.events();},// 对datatables设置默认参数setDefault:function(){$.extend($.fn.dataTable.defaults,{searching: false,// 禁用搜索ordering: false,// 禁用排序dom: "<'row'<'col-sm-12'tr>>" + "<'row'<'col-sm-5 page-info'li><'col-sm-7'p>>",scrollY: 400 // 表格里使用滚动
      });},// 初始化dataTablesinitTable:function(){var opts = this.options;var formatColumns = this.handleDataTableOption();var dataTablesOption = $.extend({columns:formatColumns.columns,aoColumnDefs:formatColumns.aoColumnDefs},opts.DataTable);this.table = $(opts.table,opts.container).DataTable(dataTablesOption);},// 事件绑定events:function(){var that = this;var opts = this.options;//设置$(opts.settingBtn,opts.container).click(function(){that.actionSetting();});},// 把数据转成dataTables需要的格式handleDataTableOption:function(){var customColumns = this.options.customColumns;var colums = [];var columnDefs = [];$.each(customColumns.pageFieldList, function (i, fieldInfo) {var fieldName = fieldInfo.fieldName;var columnDefObj = customColumns.columnDefaults && customColumns.columnDefaults[fieldName];colums.push($.extend({data: fieldName,visible: fieldInfo.display}, customColumns.columns ? customColumns.columns[fieldName] : {}));if (columnDefObj) {columnDefs.push($.extend({aTargets: [i]}, columnDefObj));}});return {columns: colums,aoColumnDefs: columnDefs}},// 渲染表头renderThead:function(){var that = this;var customColumns = this.options.customColumns;var thead = '<tr>';$.each(customColumns.pageFieldList, function (i, fieldInfo) {if (fieldInfo.display) {thead += '<th title="' + fieldInfo.displayName + '">' + fieldInfo.displayName + '</th>';} else {thead += '<th style="display:none;" title="' + fieldInfo.displayName + '">' + fieldInfo.displayName + '</th>';}});thead += '</tr>';$('thead', that.options.table).html(thead);},// 开始设置actionSetting:function(){var that = this;var list = this.options.customColumns.pageFieldList;dialog({title:'设置',content:this.getDialogContent(list),width:300,height:400,onshow:function(){$('#sortable',this.node).sortable().disableSelection();},skin:'scroll-y',okValue:'保存',ok:function(){var fieldList = [];$('li',this.node).each(function(){var data = $(this).data();fieldList.push({display: $('[name="display"]',this).prop('checked'),displayName: data.displayName,fieldName: data.fieldName});});if(!localStorage){alert('抱歉,浏览器不支持localStorage,数据保存失败!')}else{// 这里做本地缓存,可以换成ajax
            localStorage.setItem(that.options.customColumns.pageId,JSON.stringify(fieldList));alert('保存成功');that.options.customColumns.pageFieldList = fieldList;that.columnOptions = that.handleDataTableOption();// 销毁datatables实例that.table && that.table.destroy();// 重绘表头
            that.renderThead();// 用新的options重新渲染dataTablesthat.table && (that.table = $(that.options.table,that.options.container).DataTable($.extend(that.columnOptions, that.options.DataTable)));//关闭窗口this.close().remove();}return false;},cancelValue:'取消',cancel:true}).showModal();},// 生成弹窗的内容getDialogContent:function(list){var html = '';html += '<h4 class="green">可拖拽排序列表</h4>';html += '<ul id="sortable">';for(var i = 0;i < list.length;i++){html += '<li class="ui-state-default" data-display-name="' + list[i].displayName + '" data-field-name="' + list[i].fieldName + '">';html += '<span>' + list[i].displayName + '</span>';html += '<input type="checkbox" name="display" title="是否展示" ' + (list[i].display ? 'checked="checked"' : '') + ' />';html += '</li>';}html += '</ul>';return html;}});$.pageSearch = pageSearch;
})();

$.pageSearch是实现功能的核心。实现了几个方法:

1、main是程序的入口

2、setDefault对DataTables的默认设置,减少重复设置的烦恼。

3、initTable是开始对table实例化成DataTables实例。

4、events所有事件都写在这里。

5、handleDataTableOption将customColumns.columns和customColumns.aoColumnsDefs转成DataTables的columns和aoColumnsDefs。

6、renderThead因表头的排序会改变,所以要重新渲染新的表头。

7、actionSetting是对设置的保存,源码中使用localStorage保存,大家也可以改成ajax保存。

4、总结

上述只是挑选部分重要的代码,如需查看完整代码请到我的github上查看。

完整源码地址:https://github.com/ll527563266/datatables-dynamic-columns

在线预览地址:https://ll527563266.github.io/datatables-dynamic-columns

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作能力!

转载于:https://www.cnblogs.com/wy99/p/10334107.html

基于DataTables实现根据每个用户动态显示隐藏列,可排序相关推荐

  1. bootstarp js设置列隐藏_Bootstrap框架----DataTables列表移动端适配定义隐藏列

    我们在上一章节中已经学习了DataTables在BootStrap框架中的使用方式和初始化. Bootstrap框架--DataTables列表示例 最终效果如图: Bootstrap是自动适配移动端 ...

  2. JTable动态显示隐藏列

    原文:https://yq.aliyun.com/articles/40833 下面是我总结的一个操作表格列隐藏和显示的工具类: Java代码   package com.swing.table; i ...

  3. datatable 动态显示/隐藏列

    这个例子演示了 column().visible()方法来隐藏显示列,通过点击列按钮动态切换 <table id="example" class="display& ...

  4. html中怎么实现广告自动出来又自动隐藏?,基于jquery实现的定时显示与隐藏div广告的实现代码...

    基于jquery实现的定时显示与隐藏div广告的实现代码 下面我给大家分享我的方法: 在jquery中要显示与隐藏层是很简单的直接使用hide与show方法就可以了,但要定时我们需要利用setTime ...

  5. 基于Tensorflow的神经网络解决用户流失概率问题

    沙韬伟,苏宁易购高级算法工程师. 曾任职于Hewlett-Packard.滴滴出行. 数据学院特邀讲师. 主要研究方向包括风控.推荐和半监督学习.目前专注于基于深度学习及集成模型下的用户行为模式的识别 ...

  6. python基于socket进行端口转发实现后门隐藏

    python基于socket进行端口转发实现后门隐藏 思想: 用户正常浏览器访问请求通过8080端口,请求若为http请求,则正常转发到80端口保证网站正常运行.否则转发到8888端口执行系统命令. ...

  7. android动态显示/隐藏statusbar,android4.4动态显示隐藏statusbar和禁止下拉

    android4.4增加动态显示隐藏statusbar和禁止statusbar下拉功能 首先还是在设置->显示里加上图形界面 修改packages/apps/Settings/res/xml/d ...

  8. java头像交互式差分演变_一种基于交互式差分进化计算的用户知识需求获取方法与流程...

    本发明属于知识服务领域,具体涉及一种基于交互式差分进化计算的用户知识需求获取方法. 背景技术: 在多数企业拥有庞大的知识数量和优质的知识资源的情况下,如何利用推送系统将知识主动推送给设计人员以提高企业 ...

  9. ML之RS:基于用户的CF+LFM实现的推荐系统(基于相关度较高的用户实现电影推荐)

    ML之RS:基于用户的CF+LFM实现的推荐系统(基于相关度较高的用户实现电影推荐) 目录 输出结果 实现代码 输出结果 实现代码 #ML之RS:基于CF和LFM实现的推荐系统 import nump ...

最新文章

  1. gst-crypto GStreamer插件
  2. Android随机生成四则运算
  3. 如何在阿里云上构建一个合适的Kubernetes集群
  4. leetcode —— 965. 单值二叉树
  5. vue.js引入外部CSS样式和外部JS文件的方法
  6. 摄氏温度和华氏温度换算(vb源码)
  7. Java制作验证码的完整代码
  8. Linux安装python第三方库
  9. 如何设计一个好看的 404 错误页面 ?
  10. Python操作PDF的神器——PyMuPDF
  11. 浅学几天统计(SPSS)
  12. 无法查看MSN聊天记录 总弹出下载.xml文件的对话框
  13. TypeError: set expected at most 1 arguments, got 4
  14. 初中几何知识复习,已知直角三角形角度和邻边长求对边长
  15. mes项目 组态开发项目reademe文档 待整理
  16. MACOS 打开 Pycharm2020 闪退解决方法
  17. 为什么双绞线可以屏蔽外部磁场干扰?
  18. JavaScript上下文对象详细解析,ES3与ES6
  19. idea在线激活 16
  20. SUST OJ P5502

热门文章

  1. 【译】光线跟踪:理论与实现(一) 简介
  2. 记录一个ansible高级用法与shell结合
  3. VISUAL STUDIO 2008 破解方法
  4. 35+的互联网人都哪去了
  5. 从0到70%:Chrome上位揭秘!
  6. 为什么不应该重写 service 方法?
  7. 阿里巴巴高级技术专家:不要用沉默的方式一味地迎合别人的要求,据理力争或许才是作为的表现
  8. 用Kotlin写一个基于Spring Boot的RESTful服务
  9. 多线程:Vector是线程安全的吗
  10. 【Python】青少年蓝桥杯_每日一题_7.11_画太阳