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

前言

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

1、演示

2、html代码说明

3、javascript代码说明

4、总结

演示

demo.gif

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。

javascript代码

调用


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同理。

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 // 表格里使用滚动

      });

    },

    // 初始化dataTables

    initTable: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重新渲染dataTables

            that.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保存。

总结

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

完整源码地址

在线预览地址

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

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