基于DataTables实现根据每个用户动态显示隐藏列,可排序
前言
在后台管理系统开发中,难免会出现列数太多的情况,这里提供一个解决方案:用户设置显示哪些列,每个用户互不影响,并且可以根据用户的习惯设置列的排序。
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实现根据每个用户动态显示隐藏列,可排序相关推荐
- bootstarp js设置列隐藏_Bootstrap框架----DataTables列表移动端适配定义隐藏列
我们在上一章节中已经学习了DataTables在BootStrap框架中的使用方式和初始化. Bootstrap框架--DataTables列表示例 最终效果如图: Bootstrap是自动适配移动端 ...
- JTable动态显示隐藏列
原文:https://yq.aliyun.com/articles/40833 下面是我总结的一个操作表格列隐藏和显示的工具类: Java代码 package com.swing.table; i ...
- datatable 动态显示/隐藏列
这个例子演示了 column().visible()方法来隐藏显示列,通过点击列按钮动态切换 <table id="example" class="display& ...
- html中怎么实现广告自动出来又自动隐藏?,基于jquery实现的定时显示与隐藏div广告的实现代码...
基于jquery实现的定时显示与隐藏div广告的实现代码 下面我给大家分享我的方法: 在jquery中要显示与隐藏层是很简单的直接使用hide与show方法就可以了,但要定时我们需要利用setTime ...
- 基于Tensorflow的神经网络解决用户流失概率问题
沙韬伟,苏宁易购高级算法工程师. 曾任职于Hewlett-Packard.滴滴出行. 数据学院特邀讲师. 主要研究方向包括风控.推荐和半监督学习.目前专注于基于深度学习及集成模型下的用户行为模式的识别 ...
- python基于socket进行端口转发实现后门隐藏
python基于socket进行端口转发实现后门隐藏 思想: 用户正常浏览器访问请求通过8080端口,请求若为http请求,则正常转发到80端口保证网站正常运行.否则转发到8888端口执行系统命令. ...
- android动态显示/隐藏statusbar,android4.4动态显示隐藏statusbar和禁止下拉
android4.4增加动态显示隐藏statusbar和禁止statusbar下拉功能 首先还是在设置->显示里加上图形界面 修改packages/apps/Settings/res/xml/d ...
- java头像交互式差分演变_一种基于交互式差分进化计算的用户知识需求获取方法与流程...
本发明属于知识服务领域,具体涉及一种基于交互式差分进化计算的用户知识需求获取方法. 背景技术: 在多数企业拥有庞大的知识数量和优质的知识资源的情况下,如何利用推送系统将知识主动推送给设计人员以提高企业 ...
- ML之RS:基于用户的CF+LFM实现的推荐系统(基于相关度较高的用户实现电影推荐)
ML之RS:基于用户的CF+LFM实现的推荐系统(基于相关度较高的用户实现电影推荐) 目录 输出结果 实现代码 输出结果 实现代码 #ML之RS:基于CF和LFM实现的推荐系统 import nump ...
最新文章
- gst-crypto GStreamer插件
- Android随机生成四则运算
- 如何在阿里云上构建一个合适的Kubernetes集群
- leetcode —— 965. 单值二叉树
- vue.js引入外部CSS样式和外部JS文件的方法
- 摄氏温度和华氏温度换算(vb源码)
- Java制作验证码的完整代码
- Linux安装python第三方库
- 如何设计一个好看的 404 错误页面 ?
- Python操作PDF的神器——PyMuPDF
- 浅学几天统计(SPSS)
- 无法查看MSN聊天记录 总弹出下载.xml文件的对话框
- TypeError: set expected at most 1 arguments, got 4
- 初中几何知识复习,已知直角三角形角度和邻边长求对边长
- mes项目 组态开发项目reademe文档 待整理
- MACOS 打开 Pycharm2020 闪退解决方法
- 为什么双绞线可以屏蔽外部磁场干扰?
- JavaScript上下文对象详细解析,ES3与ES6
- idea在线激活 16
- SUST OJ P5502