Write By Monkeyfly

以下内容均为原创,如需转载请注明出处。

前提

  • 项目中有3个页面的表格使用到了 bootstrap-table 冻结列的功能
  • 其中,某个表格要实现如下图所示的功能:正常列表头的某些单元格需要将字体加粗并且将字体颜色变为红色

  • 功能实现了是没错,但是当使用 Ctrl + +(加号) 对浏览器页面进行缩放时,发生了特别诡异的现象不但字体颜色消失了,而且冻结列发生了及其严重的错位现象,并且这种错位是不可逆的。也就是说,一旦错位产生就只能通过重新刷新页面才能恢复正常。【很奇怪的现象】
  • F12打开浏览器的控制台,在Elements选项卡那一栏中发现:当对页面进行缩放时,表格就会自动创建一层冻结列。如果不停的对页面进行缩放,表格就会生成很多层冻结列。因为冻结列本来就是漂在正常列的上一层,如果多层冻结列叠加显示,就会产生很多视觉和功能上的问题,很是令人头疼。
  • 经过测试发现,有两个页面的表格冻结列都出现了同一个问题:当页面加载以后,表格就会进行初始化,初始化成功后,按F12打开浏览器的控制台,你会惊奇的看到,居然生成了多个冻结表头( $(".fixed-table-header-columns") )和冻结表格主体( $(".fixed-table-body-columns") )【如下图所示】

  • 通过查看 bootstrap-table-fixed-columns.js源码和bootstrap-tableHTML结构可以知道:冻结列是通过在 正常的table 前新增一个div表格,并且这个div表格是置于正常table对应的div之上来实现的。
  • 正常情况下,开启 bootstrap-table 的冻结列功能,只会出现一个冻结表头和冻结表格主体。【如下图所示】

  • 那到底是什么原因造成的呢?【说实话,这个问题在项目一开始就已经被我发现了,但由于我刚开始接触 bootstrap-table ,对它的实现原理不了解也不熟悉,再加上当时这个问题的存在对功能也没有什么影响,所以问题就一直存在着,没有被解决。直到最后项目结项时,测试测出的bug要求必须解决,这才又重新回过头来寻找问题的根源。】
  • 当我最近再次查看这个问题的时候,依然不知所措。平时遇到不会或者无法解决的问题,直接百度就可以找到答案或解决方法,毕竟有前车之鉴,解决起来还不算特别困难。但是这次,对于我目前要解决的这个问题,在网上并没有搜索到答案。可能是没有人遇到过类似的问题吧。

分析问题

  • 由于我只负责协助后台调前端的样式和功能,所以后台开发人员在遇到阻力时才会找我帮助解决问题。在平时的开发过程中,前端代码他们自己可以胜任一些。
  • 为了找到问题的根源所在,我使用了四种方法,分别是:
    1. 百度搜索 【未果】
    2. 控制台自行打断点调试 bootstrap-table 生成冻结列部分的源码(bootstrap-table-fixed-columns.js) 。虽然不能完全看懂,但是我依然在关键位置给每一行代码都打上了断点。 【花费了很长时间一行行看代码,依然未果】
    3. 查看 bootstrap-table 创建表格的源码 (bootstrap-table.js )并且打断点调试,看看会不会有什么新的发现。 【结果并没有】
    4. 比对正常页面和非正常页面初始化Bootstrap Table 的 部分js 代码。【写法一致,没什么差异,后台说就是一套复制粘贴过去的】

虽然我不知道 生成多层冻结列 的具体原因是什么,但我经过一下午的代码调试,也是有所发现的。

疑问:为何会生成生成多层冻结列呢?
肯定是将冻结表头和冻结表格主体进行了多次初始化。

主要看了bootstrap-table-fixed-columns.js中的这些地方:

BootstrapTable.prototype.initHeader = function () {}
BootstrapTable.prototype.initBody  = function () {}
BootstrapTable.prototype.resetView = function () {}

因为试了很多方法都没有作用,而且中途也花费了不少时间和精力。实在是心有余而力不足,随后我就放弃了。

万万没想到

  • 第二天在调整正常表格冻结列的那个页面HTML结构时,被我发现了异常。
  • 虽然听本人说是全套复制粘贴过去的,但在复制粘贴过程中,还是出现了纰漏。
  • 因为之前将重心都放在了比对js代码上,而忽略了HTML结构。万万没想到,居然是HTML结构出的问题。

这个问题就涉及到了 Bootstrap Table是如何使用的

当我们在HTML页面中引入Bootstrap Table所需要的jscss文件之后,我们最重要的就是:要定义好一个空的表格并给一个id,然后使用其自带的语法来创建一个Bootstrap Table

//非常简单
<table id="exampleTable"></table>

注意:

  • 当然 Bootstrap Table 还提供了一种简洁的用法,直接在table标签里面定义类似“data-...”等相关属性,就不需要在js里面进行注册了。
  • 这种用法虽然简单,但不太灵活。所以还是统一使用在js里面初始化的方式来使用table组件。

但是,正常的表格冻结列页面中可不是这么写的:发现里面有一行代码被注释掉了

//写法如下:
<table id="exampleTable"></table>
//<table id="exampleTable" data-mobile-responsive="true"></table>

我在问及为什么有一行代码被注释掉了,他本人给的说法是:最开始就是那样写的,也不知道后来怎么注释的。

这下恍然大悟,原来就是因为 设置了 data-mobile-responsive 属性 才导致冻结列出现了不该有的问题。

于是我把注释掉的代码重新打开,将上面那一行注释掉,结果可想而知:表格中确实出现了多层冻结列。
为了记住这个坑,我就把data-mobile-responsive="true"改为了data-mobile-responsive="false"【现在,问题终于解决了。】

随后,我在当前页面所引入的js代码中发现:在引入Bootstrap Table的相关jscss 文件时,里面多引入了一个js文件。即:【可能是为了适配移动端才引入的,但是在这里完全没有必要加,直接去掉就好了】

<script src="/js/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>

结束语

至此,问题就完美解决了。

关于bootstrap-table冻结列生成多个冻结表头和表格主体的问题相关推荐

  1. bootstrap table 搜索列formatter之后,单字节搜索异常

    bootstrap table 搜索列formatter之后,单字节搜索异常 最近发现搜索这边出现这个问题,这样搜索没有效果 后面发现是因为搜索列formatter之后就会出现这个问题,那么我们就多生 ...

  2. bootstrap table 动态列数据加载(一)

    bootstrap table 动态列数据加载(一) 我想把所有的收费项目作为表头,不固定死收费项目,数据库中有啥就显示啥. 动态数据加载时,不能用bean的嵌套,源码中加载表头和数据是分开的,第几列 ...

  3. [转]bootstrap table 动态列数

    原文地址:https://my.oschina.net/u/2356355/blog/1595563 据说bootstrap table非常好用,从入门教程中了解到它的以下主要功能: 由于固定表头意味 ...

  4. Bootstrap Table固定列及IE11兼容性问题解决

    最近项目的前端用的是bootstrap,用Bootstrap Table做的表格显示.有一部分表格比较特殊,需要实现固定前面几列,后面的拖动.给的原型是用的superTable实现的,整合进项目用Bo ...

  5. 使用bootstrap table和SpringBoot,mysql实现后台管理数据表格的后端分页

    最近在做后台管理系统,在数据表格展示选择dataTable和bootstrap table上浪费了很多时间,刚开始使用dataTable,但是后面发现使用ajax异步请求填充表格数据十分复杂,于是转向 ...

  6. BootStrap Table:列参数

    官方文档地址:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ 列参数 表格的列参数定义在 jQuery.fn.bootstra ...

  7. bootstrap table固定列导致复选框失效的解决方法

    //获取选中多行数据 function getSelectedRow_st() {//解決固定列导致选择复选框选不中的问题//首先判断表格是否为固定列表格,使用bootstrapTable('getO ...

  8. 关于bootstrap table 固定列宽

    首先为table 设置  style= " table-layout :  fixed ; " <table id="assessStage" data- ...

  9. bootstrapr表格父子框_JS组件系列——表格组件神器:bootstrap table(二:父子表和行列调序)...

    前言:上篇 JS组件系列--表格组件神器:bootstrap table 简单介绍了下Bootstrap Table的基础用法,没想到讨论还挺热烈的.有园友在评论中提到了父子表的用法,今天就结合Boo ...

最新文章

  1. python web开发框架flask_Python Web 开发框架,Flask 与 Django那个更好
  2. 用算法改造过的植物肉,有兴趣试试么?
  3. [转载] 杜拉拉升职记——33 360度评估
  4. vivo AI 计算平台的 ACK 混合云实践
  5. cnn识别mnist、Fashion-MNIST(pytorch)
  6. mysql解释器_atitit.java解析sql语言解析器解释器的实现
  7. me shy是什么歌 抖音make_抖音星河滚烫你是人间的理想下一句是什么歌 星河歌词完整版...
  8. 看懂 IPv6+,这篇就够了
  9. Python中通常不应该犯的7个错误
  10. flowplayer播放需求
  11. IAST技术进阶系列(四):DevOps流水线敏捷实践
  12. OPNsense用户手册-用户管理
  13. ARM的CF卡驱动分析
  14. 应用计算机测定电阻伏安特性,实验: 应用计算机测线性电阻伏安特性
  15. 【数学基础】欧式变换、相似变换、仿射变换、射影变换
  16. Digital Photo Professional 4 如何导出jpg
  17. 天池大数据比赛-天体分类总结
  18. 细数SuperComputer最新排名和常见Benchmark类型
  19. audio的自动播放
  20. (转载)有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别...

热门文章

  1. 电站锅炉行业PLM的可定制知识管理软件
  2. python自然语言处理与方言聊天机器人_聊天机器人Python实现案例 | 老炮儿聊机器语音...
  3. 风暴——老奶雷加尔使用心得
  4. type-c接口边充电边听歌解决方案
  5. 计算机对哪种储存器访问最快,计算机中访问速度最快的存储器是
  6. 根据下图实现类。在CylinderTest类中创建Cylinder类的对象,设置圆柱的底面半径和高,并输出圆柱的体积,继承性
  7. 关于汽车html网页设计完整版,10个以汽车为主题的网页设计与实现
  8. 高等数学A(一)第一章笔记分享
  9. loaded the xxx nib but the view outlet was not set 错误的解决办法。
  10. 【数据挖掘】金融风控 Task02 数据分析