前言

上次写了一个可拖动列表的插件,但除了这个特点没什么优点了,接下写的是我们常用的Bootstrap-table表格插件

正文

官网:https://bootstrap-table.com/

有两个翻译API的网址:

https://blog.csdn.net/S_clifftop/article/details/77937356?locationNum=3&fps=1

https://blog.csdn.net/mrczr/article/details/64441265

在使用时需要引入如下几个文件:

bootstrap.min.css

bootstrap-table.css

jquery.js

bootstrap.js

bootstrap-table.js

bootstrap-table-zh-CN.js(中文插件)

客户端分页例如下:

  1. // 首先销毁表格
  2. $('#fwfx_tb').bootstrapTable('destroy');
  3. // 初始化表格,动态从服务器加载数据
  4. $('#fwfx_tb').bootstrapTable({
  5. pagination: true, //启动分页
  6. striped: true, //设置为 true 会有隔行变色效果
  7. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  8. pageSize: 20,//初始页记录数
  9. sortable: true, //排序
  10. pageList: [1020], //记录数可选列表
  11. smartDisplay: false, //程序自动判断显示分页信息
  12. columns: [{
  13. title: '序号',
  14. align: 'center',
  15. halign: 'center',
  16. formatter: function (value, row, index) {
  17. return index + 1;
  18. }
  19. }, {
  20. field: 'name',
  21. title: '服务名',
  22. align: 'center',
  23. sortable:true //排序
  24. }, {
  25. field: 'sum',
  26. title: '金额',
  27. align: 'center'
  28. }, {
  29. field: 'PV',
  30. title: '访问量',
  31. align: 'center'
  32. }
  33. data: tableData
  34. });

服务器端分页例如下:

  1. $('#user_content_tab').bootstrapTable('destroy');
  2. // 初始化表格,动态从服务器加载数据
  3. $('#user_content_tab').bootstrapTable({
  4. url: "admin/query",
  5. method: 'post',
  6. sidePagination: 'server', //表示服务端请求
  7. queryParams:logUl,//请求服务器时所传的参数
  8. ajaxOptions:{ //提交ajax请求时的附加参数
  9. headers: {
  10. 'token': '94564375541867846'//这里传的token是根据你的前后台交互情况
  11. }
  12. },
  13. toolbar : '#toolbar', // 工具按钮用哪个容器
  14. pagination: true, //默认为false,表格的底部工具栏不会显示分页条
  15. queryParamsType:'',//查询参数组织方式,必须设置为空,否则没有页码params.pageNumber
  16. striped: true, //设置为 true 会有隔行变色效果
  17. pageSize: 20, //每页显示行数
  18. pageList:[10,20,50],
  19. maintainSelected: true, //在点击分页按钮或搜索按钮时,将记住checkbox的选择项
  20. smartDisplay: false, //程序自动判断显示分页信息
  21. clickToSelect: true, //是否启用点击选中行
  22. toolbarAlign: 'right', //指定 toolbar 水平方向的位置
  23. uniqueId: 'userId', //为每一行指定唯一标识符
  24. idField: 'userId', //指定主键列
  25. paginationDetailHAlign:'right',//指定分页详细信息在水平方向的位置
  26. columns: [{
  27. title: '序号',
  28. align: 'center',
  29. halign: 'center',
  30. formatter: function (value, row, index) {
  31. var options = $table.bootstrapTable('getOptions');
  32. return options.pageSize * (options.pageNumber - 1) + index + 1;
  33. }
  34. },{
  35. field: 'userId',
  36. title: '用户ID',
  37. align: 'center',
  38. },
  39. {
  40. field: 'username',
  41. title: '用户名称',
  42. align: 'center'
  43. },
  44. {
  45. field: 'roleName',
  46. title: '角色',
  47. align: 'center'
  48. },
  49. {
  50. field: 'createTime',
  51. title: '创建时间',
  52. align: 'center',
  53. formatter : function(value, row, index) {
  54. return fmtDate(value)
  55. }
  56. },
  57. {
  58. field: 'status',
  59. title: '账户状态',
  60. align: 'center'
  61. },
  62. {
  63. field: 'userId',
  64. title: '操作',
  65. align: 'center',
  66. width: 350,
  67. formatter: operateFormatter//在这里我的目的是添加按钮
  68. }],
  69. formatNoMatches: function(){
  70. return "没有相关的匹配结果";
  71. },
  72. formatLoadingMessage: function(){
  73. return "请稍等,正在加载中。。。";
  74. },
  75. responseHandler:function(res){ //加载服务器数据之前的处理程序,可以用来格式化数据,服务器返回的数据要在这里使用
  76. if(res.resCode == "403"){
  77. localStorage.clear();
  78. parent.location.href = location403;
  79. } else if(res.resStatus == 0) {
  80. for(var i = 0; i < res.resData.rows.length; i++) {
  81. if(res.resData.rows[i].status) {
  82. res.resData.rows[i].status = '启用';
  83. } else {
  84. res.resData.rows[i].status = '禁用';
  85. }
  86. }
  87. var cusData = {//这里的处理数据是根据你前后台交互的数据情况来的
  88. "rows": res.resData.rows,
  89. "total": res.resData.total
  90. }
  91. return cusData;
  92. } else {
  93. toastr.info(res.resMsg);
  94. return;
  95. }
  96. }
  97. });
  98.  
  99. function logUl(params){
  100. pageNumbers = params.pageNumber;
  101. pageSizes = params.pageSize;
  102. return {
  103. "pageNo": params.pageNumber,
  104. "pageSize": params.pageSize,
  105. "username": queryVal
  106. }
  107. }
  108.  
  109. function operateFormatter(value, row, index){ //添加按钮
  110. var rows = JSON.stringify(row);
  111. // 根据传过来的参数添加不同的class
  112. var classED = 'enabledE';
  113. var classEDVal;
  114. if(row.status == '启用') {
  115. classED = 'enabledD';
  116. classEDVal = '禁用';
  117. } else {
  118. classED = 'enabledE';
  119. classEDVal = '启用';
  120. }
  121. // onclick=modif(' + value + "," + rows + "," + index + ')
  122. return [
  123. '<div class="modify operationBtn" title="重置密码" table-data=' + rows + '><i class="glyphicon glyphicon-pencil"></i>重置密码</div>',
  124. '<div class="enabled operationBtn '+ classED + '" title="禁用/启用" table-data=' + rows + '><i class="glyphicon glyphicon-user"></i>' + classEDVal + '</div>',
  125. '<div class="del operationBtn" title="删除" table-data=' + rows + '><i class="glyphicon glyphicon-trash"></i>删除</div>'
  126. ].join("")
  127. }

拖动列来控制列宽的插件:

引入bootstrap-table-resizable.js和colResizable-1.6.min.js

  1. $("#exampleTable").colResizable({
  2. liveDrag: true,//实时显示滑动位置
  3. gripInnerHtml: "<div class='grip'></div>",
  4. //draggingClass: "dragging",
  5. postbackSafe: true,//刷新后保留之前的拖拽宽度
  6. headerOnly:true,
  7. resizeMode:"overflow",
  8. //onResize: onSampleResized
  9. });

一些功能实现的样例:

1.选中

  1. $('#generateClueObjectTable').bootstrapTable('checkBy', { field:"这里是选中行列字段", values:[这里选中行是列字段内的值,可多个]});

只可选中一行,使用check.bs.table事件(当用户选中一行时触发的事件)

  1. $('#generateClueObjectTable').on('check.bs.table', function (row,element,input) {
  2. if (_this.addResearchReportTransObjectJudge) {
  3. let selections = $("#generateClueObjectTable").bootstrapTable('getSelections');
  4. if (selections.length > 1) {
  5. $('#generateClueObjectTable').bootstrapTable('uncheck',input[0].dataset.index);
  6. _this.$message.error('只能选择一个对象');
  7. }
  8. }
  9. });

2.禁止全选操作,例:

  1. check-all.bs.table 全选事件
  1. $('#generateClueObjectTable').on('check-all.bs.table', function (row,element,input) {
  2. if(_this.addResearchReportTransObjectJudge) {
  3. $("#generateClueObjectTable").bootstrapTable('uncheckAll');//阻止全选
  4. }
  5. });

3.为复选框(checkbox)禁用或选中,例:

在复选框(checkbox)列中使用formatter

  1. formatter: function (value, row, index) {
  2. return {
  3. disabled : true //设置是否可用
  4. checked : true//设置选中
  5. }
  6. }

4.在表格中嵌套表格,例:

  1. columns:[{
  2. title: '部门',
  3. align: 'left',
  4. sortable: false,
  5. formatter: function (value, row, index) {
  6. return row.deptName;
  7. }
  8. },{
  9. field: '',
  10. title: "<table id=\"statisticTable\" class=\"tables\" style='border:1px solid #bdd5dd;'>" +
  11. "<thead><tr>" +
  12. "<th style=\"width:9%;padding-left: 10px;\" class=\"statisticTableTD\">状态</th>" +
  13. "<th style=\"width:9%;padding-left: 10px;\" class=\"statisticTableTD\">数量</th>" +
  14. "<th style=\"width:9%;padding-left: 10px;\" class=\"statisticTableTD\">自主调研</th>" +
  15. "<th style=\"width:9%;padding-left: 10px;\" class=\"statisticTableTD\">上级交办</th>" +
  16. "</tr></thead>" +
  17. "</table>",
  18. align: 'left',
  19. sortable: false,
  20. formatter: function (value, row, index) {
  21. var table = "<table class='table-keyValue' style='border:1px solid #d0e3e9;'>";
  22. $.each(row.stats, function (i, item) {
  23. table += "<tr><td style=\"width:9%;\" class='statisticTableTD '>" + (item.statusCn == null ? 0 : item.statusCn) + "</td>"
  24. + "<td style=\"width:9%;\" class='statisticTableTD'>" + (item.number == null ? 0 : item.number) + "</td>"
  25. + "<td style=\"width:9%;\" class='statisticTableTD'>" + (item.source1 == null ? 0 : item.source1) + "</td>"
  26. + "<td style=\"width:9%;\" class='statisticTableTD'>" + (item.source0 == null ? 0 : item.source0) + "</td>" + "</tr>";
  27. });
  28. table += "</table>";
  29. return table;
  30. }
  31. }]

5.实现多层表头

colspan 每格所占的列数
rowspan 每格所占的行数

  1. columns: [
  2. [{
  3. title: '这是标题',
  4. field: '',
  5. align: 'center',
  6. valign: 'middle',
  7. colspan: 10
  8. }],
  9. [{
  10. title: '这是标题1',
  11. field: '',
  12. align: 'center',
  13. valign: 'middle',
  14. colspan: 1,
  15. rowspan: 2
  16. }, {
  17. title: '这是标题2',
  18. field: '',
  19. align: 'center',
  20. valign: 'middle',
  21. colspan: 4,
  22. rowsapn: 1
  23. }, {
  24. title: '这是标题3',
  25. field: '',
  26. align: 'center',
  27. valign: 'middle',
  28. colspan: 5,
  29. rowsapn: 1
  30. }],
  31. [{
  32. field: 'title1', //列ID同时也是指定要显示的数据的ID
  33. title: '标题',
  34. width: 100,
  35. align: 'center',
  36. valign: 'middle',
  37. sortable: true
  38. },
  39. ......
  40. ]
  41. ]

下面是遇到的问题:

问题1.在设置为服务器端分页时,获取页码的params.pageNumber会返回undefined

这是因为queryParamsType的默认参数是limit,在官方说明中这样解释:

  "如果 queryParamsType = 'limit' ,返回参数必须包含limit, offset, search, sort, order 否则, 需要包含: pageSize, pageNumber, searchText, sortName, sortOrder. 返回false将会终止请求"

有两种解决方法:

  1.为queryParamsType传空参数,即queryParamsType : "",这时没有params.limit,但可用params.pageSize来代替

  2.修改源码

  首先在bootstrap-table.min.js中搜索 "limit"===this.options.queryParamsType&& (完全复制过去搜索,当然因为版本的原因,一些版本代码细微处可能不太一样,但是肯定跟limit有关)找到下面的代码片段:

  1. "limit"===this.options.queryParamsType&&(i={search:i.searchText,sort:i.sortName,order:i.sortOrder},this.options.pagination&&(i.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1),i.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize))

可以看到在this.options.pagination&&后面的括号中有i.offset=...和i.limit=...的代码,

在i.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize后面加上,i.pageNumber=this.options.pageNumber(记得一定要英文逗号分隔)

最终修改后结果如下:

  1. "limit"===this.options.queryParamsType&&(i={search:i.searchText,sort:i.sortName,order:i.sortOrder},this.options.pagination&&(i.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1),i.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize, i.pageNumber=this.options.pageNumber))

这样就可以通过params.pageNumber取到页码

问题2:在向表格内写入自定义元素时在列中使用formatter方法,但在元素中不可直接添加事件,否则无效,只可使用js获取元素后添加事件.

问题3:在向表格内写入自定义元素时在列中使用formatter方法,但在元素中添加行数据row时,必须先将json数据转为字符串才可使用,如:

  1. var rows = JSON.stringify(row);

且在添加元素内时必须使用单引号('')包含,如:

  1. "<span class='classDataTable transRelateName' table-data='" + JSON.stringify(row) + "'>" + row.relateName + "</span>"
  1. 问题4:当表格中有点击事件的自定义元素时,换页会导致无法点击?
  1. 方法一(推荐,如果在vue等框架内要保证类名和事件函数内调用的函数是唯一的):在写点击事件时需要按如下方法书写:
  1. $(document).on('click', '.researchName', function () {}
  1. 方法二:把事件单独写一个函数,在表格中添加换页事件onPageChange,事件调用函数就行

问题5:设置列宽问题
  首先要给table加个下面的样式:
    table-layout: fixed;
  然后给列设置属性:
    width: 300

Bootstrap-table表格插件的使用方法的更多相关文章

  1. [转]手把手教你--Bootstrap Table表格插件及数据导出(可导出Excel2003及Exce2007)

    原文地址:https://blog.csdn.net/javayoucome/article/details/80081771 1.介绍 Bootstrap Table介绍见官网:http://boo ...

  2. Bootstrap Table表格一直加载(load)不了数据-解决办法

    bootstrap-table是一个基于Bootstrap风格的强大的表格插件神器,官网:http://bootstrap-table.wenzhixin.net.cn/zh-cn/ 这里列出遇到的一 ...

  3. JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

    前言:前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基础上能够同时拖拽选中的多行.博主用了半天时间研究了下,效果是出来了,但是感觉不尽 ...

  4. bootstrap table表格属性、列属性、事件、方法

    留存一份,原文地址http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ 表格参数 表格的参数定义在 jQuery.fn.bootst ...

  5. bootstrap 分页表格插件

    找了两个table的插件,一个是bootstrap table ,另一个是bootstrap-paginator 这里只介绍 bootstrap table 插件 使用及简单案例 文档介绍:http: ...

  6. html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式

    先上代码   <script type="text/javascript" language="javascript">   var idTmr; ...

  7. JS组件系列——Bootstrap Table 表格行拖拽

    前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了.这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~ 一.业务需求及实现效果 项目涉及到订单模块,那天突然接到 ...

  8. Bootstrap Table列宽拖动的方法

    在之前做过的一个web项目中,前端表格是基于jQuery和Bootstrap Table实现的,要求能利用拖动改变列宽,现将实现的过程记录如下: 1. Bootstrap Table可拖动,需要用到它 ...

  9. 基于Bootstrap的表格插件bootstrap-table

    写在前面: 表格在项目中是使用比较多的,bootstrap-table插件也是非常好用,而且表格页面也比较好看.这里也简单的记录下. 下面直接看demo吧,代码中都注释了,有些用法,这里没有用到,需要 ...

随机推荐

  1. MySQL中日期和时间类型

    1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割 ...

  2. OSI网络模型和网络连接设备

    OSI网络模型和网络连接设备 OSI模型 7层之间传输的协议传输单元(PDU)的专业叫法. 第7-5层(应用层)传输的pdu叫:data 第4层(传输层)传输的pdu叫:segment(数据段) 第3 ...

  3. fetchone函数和fetchall函数返回值的区别

     fetchone函数和fetchall函数返回值的区别 1.fetchone() 返回单个的元组,也就是一条记录(row),如果没有结果,则python返回 None 有结果时,如图: 没结果时,如 ...

  4. KETTLE入门教程-单表读取

    kettle初探 Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.Kettle 中文名称叫水壶,该项目的主程 ...

  5. linux虚拟机安装python 及 配置环境变量

    一.安装anaconda 下载anaconda安装包 (wget -P filepath 下载链接) linux下安装anaconda教程,并添加清华镜像 sh Anaconda3-5.3.1-Lin ...

  6. [C4W3] Convolutional Neural Networks - Object detection

    第三周 目标检测(Object detection) 目标定位(Object localization) 大家好,欢迎回来,这一周我们学习的主要内容是对象检测,它是计算机视觉领域中一个新兴的应用方向, ...

  7. 第九周周四计划&&周三总结

    今天由于自己的原因进度不是很大,今天整理了一下全网关联的思路流程(个人可能就是那种没自信,在思路不知道对不对的情况下不敢下手那种渣渣),和之前的一个学长讨论了一下大概思路流程,如下: (1)使用LDA ...

  8. Linux 目录详细介绍

    [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录,是用户主目录的基点 ...

  9. 剑指offer:序列化二叉(前序遍历+层次)

    1. 题目描述 /** 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存. 序列 ...

  10. [NewLife.XCode]百亿级性能

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...