Bootstrap框架----DataTables列表折叠列

Posted 张小凡vip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bootstrap框架----DataTables列表折叠列相关的知识,希望对你有一定的参考价值。

我们在上一章节中已经学习了DataTables在BootStrap框架中的使用方式和初始化。
Bootstrap框架——DataTables列表示例

本章学习行详细内容的展开与折叠,当数据量多时,可以通过点击按钮后再去请求获取数据进行展示。

官网例子参考
行详细内容的展开与折叠
http://datatables.club/example/user_share/row_details.html

环境准备

DataTables列表折叠列的使用建立在上篇文件的基础上
Bootstrap框架——DataTables列表示例

最终效果

实现方案

在列头中增加一列

<th width="6%">详情</th>

在datatables初始化的js列绑定columns数组中对应增加一列

     , 
                        "data": "id",
                        "class": "text-center",
                        "render": function (id, type, row, position) 
                            return  '<span class="expand-detail">...</span>';
                        
                    

在与colunms并列的位置添加createdRow属性

  "createdRow": function (row, data, index) 
              $(row).attr('index', index);
          ,

在dataTables初始化的方法后绑定点击事件

.on('click', 'span.expand-detail', function (event) 
        toggleDetailRow($(this).closest("tr").attr("index"));
    )

在定义名为$dt的dataTable的refreshTable方法中增加toggleDetailRow方法
toggleDetailRow方法主要实现要显示内容的构造,如果要请求数据的话,可以使用ajax去请求。

/**
     * toggle详情内容
     * @param index 展开详情的索引
     * @param forceUpdate 是否强制更新内容
     */
    function toggleDetailRow(index, forceUpdate) 
        var row = $dt.DataTable().row(index);
        var data = row.data();
        var $tr = row.nodes().to$();
        var $nextTr = $tr.next("tr");
        if ($nextTr.is('.row-detail')) 
            $nextTr.remove(); // 移除
            if (!forceUpdate) return;
        

        var writer = [];
        writer.push('<tr class="row-detail"><td colspan="' + $tr.children().length + '"><div>');
        writer.push($.format('<h4>姓名:name</h4>', data));
        writer.push('<h4>li样式:</h4>');
        writer.push('<ul class="status-hisotry">');
        for (var i = 0;i<3; i++) 
            i > 0 && writer.push('<li class="glyphicon glyphicon-arrow-right"></li>');
            writer.push('<li class="status">'+i+'</li>');
        
        writer.push('</ul>');
        writer.push($.format('<div id="info-name">信息加载中...</div>', data));
        writer.push('</div></td></tr>');
        $tr.after(writer.join(''));
        $.ajax(
            url: '/findContact?name=' + data.name,
            cache: true,
            dataType: 'json'
        ).done(function (res) 
            if (!res.code) 
                if (res.data) 
                    $('#info-' + data.name).replaceWith($.format('<h4>测试ajax获取信息:<a href="/findContact?name=name">name</a></h4>', res.data));
                 else 
                    $('#info-' + data.name).replaceWith('<h4>未查到相关联系人信息</h4>');
                
             else 
                $('#info-' + data.name).replaceWith(res.error);
            
        );
    

在refreshTable方法方法外增加toggleDetailRow中用到的format定义

/**
   * 格式化字符串 第一个参数为格式化模板 format('this is a 0 template!', 'format');
   * format('this is a 0.message template!',  message: 'format'); 等同于
   * format('this is a message template!',  message: 'format' );
   */
$.format = function() 
  var template = arguments[0],
    templateArgs = arguments,
    stringify = function(obj) 
      if (obj == null) 
        return '';
       else if (typeof obj === 'function') 
        return obj();
       else if (typeof obj !== 'string') 
        return JSON.stringify ? JSON.stringify(obj) : obj;
      
      return obj;
    ;
  return template.replace(/\\\\w+(\\.\\w+)*\\/g, function(match) 
    var propChains = match.slice(1, -1).split('.');
    var index = isNaN(propChains[0]) ? 0 : +propChains.shift();
    var arg, prop;
    if (index + 1 < templateArgs.length) 
      arg = templateArgs[index + 1];
      while (prop = propChains.shift()) 
        arg = arg[prop] == null ? '' : arg[prop];
      
      return stringify(arg);
    
    return match;
  );
;

增加样式

  <style type="text/css">
    .row-detail td 
        background-color: #eee;
    

    .row-detail td:first-child:before
    content:'' !important;
    margin:0 !important;
    padding:0 !important;
    border:none !important;
    background-color:transparent !important;
    box-shadow:none !important;
    

    .row-detail .status 
        text-align: center;
        display: inline-block;
        min-width: 80px;
    

    .row-detail .glyphicon-arrow-right 
        vertical-align: top;
        margin: 2px 10px 0 10px;
        color: green;
    

    .remark-history .remark 
        margin-left: 30px;
    

    .expand-detail 
        display: block;
        line-height: 60px;
        cursor: pointer;
    
</style>

IndexController中增加方法

  @RequestMapping("/findContact")
        @ResponseBody
        public Object findContact(@RequestParam String name) 
          Contacts contact= mongoTemplate.findOne(new Query(Criteria.where("name").is(name)), Contacts.class);
          if(contact!=null) 
              return  JSONResult.success(contact);
          
          return JSONResult.error("未查询到联系人");
        

JSONResult

package com.test.web.message.response;

/**
 * JSONResult
 * 标准化的JSON响应
 * 
 * <pre>
 * @link JSONResult#success(Object)
 * @link JSONResult#error(String)
 * </pre>
 * 
 * 
 */
public class JSONResult 

    /**
     * 成功的代码
     */
    public static final int         CODE_SUCCESS            = 0;

    /**
     * 错误的代码,可根据错误类型进行详细分类
     */
    public static final int         CODE_ERROR              = -1;

    /**
     * 空白的成功响应
     */
    public static final JSONResult  RESULT_SUCCESS_NO_DATA  = new JSONResult(CODE_SUCCESS, null, null);

    private int                     code;
    private String                  msg;
    private Object                  data;

    /**
     * 创建一个成功的响应
     * 
     * @param data
     * @return
     */
    public static JSONResult success(Object data) 
        return new JSONResult(CODE_SUCCESS, null, data);
    

    /**
     * 创建一个错误的响应
     * 
     * @param msg
     * @return
     */
    public static JSONResult error(String msg) 
        return new JSONResult(CODE_ERROR, msg, null);
    

    /**
     * @param code
     * @param msg
     * @param data
     */
    public JSONResult(int code, String msg, Object data) 
        this.code = code;
        this.setMsg(msg);
        this.data = data;
    

    public int getCode() 
        return code;
    

    public JSONResult setCode(int code) 
        this.code = code;
        return this;
    

    public Object getData() 
        return data;
    

    public JSONResult setData(Object data) 
        this.data = data;
        return this;
    

    public String getMsg() 
        return msg;
    

    public JSONResult setMsg(String msg) 
        this.msg = msg;
        return this;
    

完整Jsp

<%@ include file="./include/header.jsp"%>  
  <style type="text/css">
    .row-detail td 
        background-color: #eee;
    

    .row-detail td:first-child:before
    content:'' !important;
    margin:0 !important;
    padding:0 !important;
    border:none !important;
    background-color:transparent !important;
    box-shadow:none !important;
    

    .row-detail .status 
        text-align: center;
        display: inline-block;
        min-width: 80px;
    

    .row-detail .glyphicon-arrow-right 
        vertical-align: top;
        margin: 2px 10px 0 10px;
        color: green;
    

    .remark-history .remark 
        margin-left: 30px;
    

    .expand-detail 
        display: block;
        line-height: 60px;
        cursor: pointer;
    
</style>

<!-- jquery.dataTables.css -->
<link href="/plugins/DataTables-1.10.16/media/css/dataTables.bootstrap.css" rel="stylesheet"
          type="text/css"></link>
<link rel="stylesheet" href="/plugins/DataTables-1.10.16/extensions/Responsive/css/responsive.dataTables.css"></link>
  <!-- DATE STYLES-->
<link rel="stylesheet" href="/plugins/bootstrap-datetimepicker-master/css/bootstrap-datetimepicker.min.css"></link>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<%@ taglib prefix="cf" uri="com.data.web.view.function" %>  
        <div id="page-wrapper">  
            <div id="page-inner">  


        <div class="row">  
                    <div class="col-md-12">  
                        <h1 class="page-header">  
              DataTables<small>示例</small>  
                        </h1>  
                    </div>  
       </div>  


       <div class="row">
            <form class="form-inline col-sm-11" id="search_form">
                <div class="form-group ">
                    <input class="form-control" placeholder="名称或其他" name="name">
                </div>
                <div class="form-group">
                    <select class="form-control" id="gender" name="gender">
                        <option value="">--</option>
                        <option value=1></option>
                        <option value=0></option>
                    </select>
                </div>
                <div class="form-group">
                    <label for="beginTime">开始</label> <input type="text"
                        class="datepicker form-control"
                        data-date-format="yyyy-mm-dd 00:00:00" name="beginTime"
                        id="beginTime" />
                </div>
                <div class="form-group">
                    <label for="endTime">截止</label> <input type="text"
                        class="datepicker form-control"
                        data-date-format="yyyy-mm-dd 23:59:59" name="endTime" id="endTime" />
                </div>
                <button type="button" id="query" class="btn btn-success query mt-5">查询</button>
                <button type="button" id="add" class="btn btn-info add mt-5">新建</button>
            </form>
        </div>
        <!-- /. ROW  -->


      <div class="row">
            <div class="col-md-12">
                <div class="panel panel-default">
                    <div class="panel-heading">示例列表</div>
                    <div class="panel-body">
                        <div class="table-responsive">
                            <table class="table table-striped table-bordered responsive table-hover" id="table" cellspacing="0" width="100%">
                                <thead>
                                    <tr>
                                        <th width="8%" >姓名</th>
                                        <th width="10%" >电话</th>
                                        <th width="10%" >性别</th>
                                        <th width="10%" class="desktop">时间</th>
                                        <th width="8%" class="desktop">操作</th> 
                                        <th width="6%">详情</th>
                                    </tr>
                                </thead>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <!-- /. ROW  -->

        </div>  
            <!-- /. PAGE INNER  -->  
        </div>  
        <!-- /. PAGE WRAPPER  -->  
 <%@ include file="./include/footer.jsp"%>  
 <!-- DATA TABLE SCRIPTS -->
<script type="text/javascript" src="/plugins/DataTables-1.10.16/media/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="/plugins/DataTables-1.10.16/media/js/dataTables.bootstrap.min.js"></script>
<script src="/plugins/DataTables-1.10.16/extensions/Responsive/js/dataTables.responsive.js"></script>
<script src="/plugins/bootstrap-datetimepicker-master/js/bootstrap-datetimepicker.min.js"></script>
<script src="/plugins/bootstrap-datetimepicker-master/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>
<script type="text/javascript">
$(document).ready(function() 

    $('.datepicker').datetimepicker(
        language : 'zh-CN',
        autoclose : true
    );

    refreshTable();//刷新列表数据内容
    clickEvent();//绑定表格中的按钮事件

    //点击查询  
    $('button.query').on("click", function() 
        refreshTable();
        clickEvent();
    );

    $('button.add').on('click',function()
        location.href = '/create';
    );

);
function clickEvent()
    $('#table').on('click','.js-delete',function()
        if(confirm('确认删除该条数据?'))
            var id = $(this).attr('data-id');
            $.get('/delete?id='+id+'', function(result)
            console.log(result);
                if(result==0)
                    alert('删除成功');
                    window.location.reload();
                
            )
        
    ).on('click','.js-edit',function()
        var id = $(this).attr('data-id');
        location.href = '/edit?id='+id+'';
    )


function refreshTable()

    var $searchForm = $('#search_form').on('submit', function () 
        $dt.DataTable().searchEx().draw();
        return false;
    );

    var $dt = $('#table').on('preXhr.dt', function (e, settings, data) 
        //data.search.value = $searchForm.formGet();
    ).dataTable(
        "columns" : [
            
                "data" : "name",
                "class" : "text-center"
            ,
            
                "data" : "tel",
                "class" : "text-center",
                "render" : function(data, type, row) 
                    if(data)
                    var ms="00-";
                    ms=row.name+"的电话"+ms+data;
                    return ms;
                    
                    return "";
                
            ,
            
                "data" : "gender",
                "class" : "text-center",
                "render" : function(data, type, row) 
                    if(data==0)
                    return "女";
                    else if(data==1)
                    return "男";
                    
                    return "";
                
            ,
            
                "data" : "creatTime",
                "class" : "text-center",
                "render" : function(data, type, row) 
                    return new Date(data).Format("yyyy-MM-dd hh:mm:ss");  
                
            ,
            
                "data" : "id",
                "class" : "text-center",
                "render" : function(data, type, row) 
                    return '<span class="btn btn-primary btn-xs ml-5 js-edit" data-id="'+data+'">编辑</span> <span class="btn btn-danger btn-xs ml-5 js-delete" data-id="'+data+'">删除</span>';
                
            , 
                "data": "id",
                "class": "text-center",
                "render": function (id, type, row, position) 
                    return  '<span class="expand-detail">...</span>';
                
            
          ],
         "createdRow": function (row, data, index) 
              $(row).attr('index', index);
          ,
        "ajax" : //类似jquery的ajax参数,基本都可以用。
            type : "post",//后台指定了方式,默认get,外加datatable默认构造的参数很长,有可能超过get的最大长度。
            url : "/listData",
            dataSrc : "data",//默认data,也可以写其他的,格式化table的时候取里面的数据
            data : function(d) //d 是原始的发送给服务器的数据,默认很长。
                var param = ;//因为服务端排序,可以新建一个参数对象
                param.start = d.start;//开始的序号
                param.length = d.length;//要取的数据的
                var formData = $(
                        "#search_form")
                        .serializeArray();//把form里面的数据序列化成数组
                formData
                        .forEach(function(e) 
                            param[e.name] = e.value;
                        );
                return param;//自定义需要传递的参数。
            ,
        ,
        //"ajax": $.fn.dataTable.pagerAjax(url: "/listData"),
        "destroy":true,
        lengthChange : false,
        serverSide : true,//分页,取数据等等的都放到服务端去
        searching : false,
        processing : true,//载入数据的时候是否显示“载入中”
        bDestroy : true,
        pageLength : 20,//首次加载的数据条数
        ordering : false,//排序操作在服务端进行,所以可以关了。
        language : 
            processing : "载入中",//处理页面数据的时候的显示
            paginate : //分页的样式文本内容。
                previous : "上一页",
                next : "下一页",
                first : "第一页",
                last : "最后一页"
            ,
            zeroRecords : "没有内容",//table tbody内容为空时,tbody的内容。
            //下面三者构成了总体的左下角的内容。
            info : "第 _PAGE_/_PAGES_页 共 _TOTAL_条记录",//左下角的信息显示,大写的词为关键字。
            infoEmpty : "第 _PAGE_/_PAGES_页 共 _TOTAL_条记录",//筛选为空时左下角的显示。
            infoFiltered : ""//筛选之后的左下角筛选提示(另一个是分页信息显示,在上面的info中已经设置,所以可以不显示),
        ,
        "columnDefs": [
            "defaultContent": "",
            "targets": "_all"
          ]
    ).on('click', 'a[row-index]', function () 
    ).on('click', 'span.expand-detail', function (event) 
        toggleDetailRow($(this).closest("tr").attr("index"));
    ); 





    /**
     * toggle详情内容
     * @param index 展开详情的索引
     * @param forceUpdate 是否强制更新内容
     */
    function toggleDetailRow(index, forceUpdate) 
        var row = $dt.DataTable().row(index);
        var data = row.data();
        var $tr = row.nodes().to$();
        var $nextTr = $tr.next("tr");
        if ($nextTr.is('.row-detail')) 
            $nextTr.remove(); // 移除
            if (!forceUpdate) return;
        

        var writer = [];
        writer.push('<tr class="row-detail"><td colspan="' + $tr.children().length + '"><div>');
        writer.push($.format('<h4>姓名:name</h4>', data));
        writer.push('<h4>li样式:</h4>');
        writer.push('<ul class="status-hisotry">');
        for (var i = 0;i<3; i++) 
            i > 0 && writer.push('<li class="glyphicon glyphicon-arrow-right"></li>');
            writer.push('<li class="status">'+i+'</li>');
        
        writer.push('</ul>');
        writer.push($.format('<div id="info-name">信息加载中...</div>', data));
        writer.push('</div></td></tr>');
        $tr.after(writer.join(''));
        $.ajax(
            url: '/findContact?name=' + data.name,
            cache: true,
            dataType: 'json'
        ).done(function (res) 
            if (!res.code) 
                if (res.data) 
                    $('#info-' + data.name).replaceWith($.format('<h4>测试ajax获取信息:<a href="/findContact?name=name">name</a></h4>', res.data));
                 else 
                    $('#info-' + data.name).replaceWith('<h4>未查到相关联系人信息</h4>');
                
             else 
                $('#info-' + data.name).replaceWith(res.error);
            
        );
    




/**
   * 格式化字符串 第一个参数为格式化模板 format('this is a 0 template!', 'format');
   * format('this is a 0.message template!',  message: 'format'); 等同于
   * format('this is a message template!',  message: 'format' );
   */
$.format = function() 
  var template = arguments[0],
    templateArgs = arguments,
    stringify = function(obj) 
      if (obj == null) 
        return '';
       else if (typeof obj === 'function') 
        return obj();
       else if (typeof obj !== 'string') 
        return JSON.stringify ? JSON.stringify(obj) : obj;
      
      return obj;
    ;
  return template.replace(/\\\\w+(\\.\\w+)*\\/g, function(match) 
    var propChains = match.slice(1, -1).split('.');
    var index = isNaN(propChains[0]) ? 0 : +propChains.shift();
    var arg, prop;
    if (index + 1 < templateArgs.length) 
      arg = templateArgs[index + 1];
      while (prop = propChains.shift()) 
        arg = arg[prop] == null ? '' : arg[prop];
      
      return stringify(arg);
    
    return match;
  );
;




//对Date的扩展,将 Date 转化为指定格式的String
//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, 
//年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) 
//例子: 
//(new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 
//(new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18 
Date.prototype.Format = function (fmt)  //author: meizz 
 var o = 
     "M+": this.getMonth() + 1, //月份 
     "d+": this.getDate(), //日 
     "h+": this.g

以上是关于Bootstrap框架----DataTables列表折叠列的主要内容,如果未能解决你的问题,请参考以下文章

jQuery-DataTables相关的网址

关于datatables和bootstrap插件使用问题

DataTables 使用 Bootstrap 4 条带表固定列透明

Bootstrap 和 Datatables 折叠行

datatables bootstrap-table 哪个好

标题/数据列未与 jQuery dataTables、bootstrap 2.3.2 对齐并启用水平滚动