EasyUI 数据表格datagrid列自适应内容宽度的实现


Posted in Javascript onJuly 18, 2019

项目初期在加载数据表格的时候为了提高表格数据渲染速度,设置了默认宽度。

现需求需要加一个表格自适应的功能,触发改功能,改变列宽度,但是不重新渲染表格,不发生数据请求。

设计思路,遍历每项的所有数据,比较字节符串长度,取最大长度。再用最大长度和标题长度比较,如果标题长就去标题长度,如果字符串长,就取字符串的。

js

//表格自适应方法
function changeWidth(agstr){
  var dg = $('#'+agstr);
  dg.datagrid("loading");//显示加载状态$$$
  var fn=function(){
    var opts = dg.datagrid('getColumnFields');  //获取表头所有field
    var data=dg.datagrid('getData');//获取数据表格请求的数据
    var role = data.rows;//数据表格请求的数据,即每行的数据
      for (var i = 0; i <opts.length ;i++) { //循环每一列的数据内容
        var field=opts[i];
        var ro_width = 0;
        if(field != ''){
          var col = dg.datagrid('getColumnOption', field);
          var col_title = col.title;
          for(j=0;j<role.length;j++){
            if(StringTolog(role[j][field])>ro_width){
              ro_width = StringTolog(role[j][field]);//比较当前field列的每条数据长度,取最大值
            }
          }
        if(ro_width<StringTolog(col_title)){//如果当前列数据长度小于当前列表头长度则取表头长度
          ro_width =StringTolog(col_title);
        }
    
        var ro_length=ro_width*14+10;//14是页面字体像素大小 10是单元格左右内边距大小
        $("td[field='"+field+"'] div").width(ro_length);//设置列宽样式
        dg.datagrid('lockColumn',field);//禁止数据表格改变列宽※※※
      }
    }  
    dg.datagrid("loaded");//隐藏加载状态$$$
  }
  setTimeout(fn,0);
}

//字符串的粗略换算
function StringTolog(Str){
  if(Str==null){
    return 0;
  }
  Str = Str.toString();//该方法将取到的数据转为String类型
  Str = Str.replace(/\s+/g,'');//替换空格
  //两个字节为长度1,一个字节为长度0.5,计算字符串总长度
  var newStr = (Str.length-Str.replace(/[\x00-\xff]+/g,'').length)/2
          +Str.replace(/[\x00-\xff]+/g,'').length;
  return newStr;
}

调用以上两个方法就可以实现列宽自适应。

但是发现执行此方法之后,表头和表身的单元格宽度都已经固定写死,如果此时触发调整列宽大小事件,只能改变表头宽度,不会改变表身列宽,所以自适应列宽后可以取消改变列宽大小的功能

封装冻结列方法:

//冻结列,禁止调节列尺寸$("#id").datagrid('lockColumn',field值);
$.extend($.fn.datagrid.methods, {
  lockColumn: function(jq, field){
    return jq.each(function(){
      var p = $(this).datagrid('getPanel');  // 获取数据表格面板
      var cell = p.find('div.datagrid-header td[field=' + field + '] > div.datagrid-cell'); // 获取数据表格监听改变列宽事件的节点
      cell.resizable({disabled:true}); // 禁止改变列宽
    });
  }
});

在给每列设置宽度的时候调用该方法

dg.datagrid('lockColumn',field);

changeWidth 方法中的※※※位置

在重新定义列宽的时候如果数据量过大会导致页面卡顿,可以再触发该方法的开始位置调用datagrid的loading方法,结束时调用loaded方法,changeWidth 方法中的$$$位置

EasyUI 数据表格datagrid列自适应内容宽度的实现

因为在触发表格自适应方法后调用了datagrid的冻结列方法,所以再重新查询数据的时候表头不会重新渲染,只有表身会,,表身就会恢复默认宽度,就会出现表头和表身对不齐的问题,表头也不能改变宽度。

解决办法,在数据表格数据加载成功时取消冻结列,清空之前计算的列宽

EasyUI 数据表格datagrid列自适应内容宽度的实现

封装取消冻结列方法

//取消冻结列,允许调节列尺寸$("#id").datagrid('unlockColumn',field值);
$.extend($.fn.datagrid.methods, {
  unlockColumn: function(jq, field){
    return jq.each(function(){
      var p = $(this).datagrid('getPanel');  // 获取数据表格面板
      var cell = p.find('div.datagrid-header td[field=' + field + '] > div.datagrid-cell'); // 获取数据表格监听改变列宽事件的节点
      cell.resizable({disabled:false}); // 允许改变列宽
    });
  }
});

数据加载成功触发

onLoadSuccess: function (data) {
      var opts = $(this).datagrid('getColumnFields');  //获取表头所有field
       for(var i=0;i<opts.length;i++){
         $(this).datagrid('unlockColumn',opts[i]);//允许调整列尺寸
         $("tr.datagrid-header-row td[field='"+opts[i]+"'] div").width('');//清空表格自适应时计算的表头宽度
       }
    },

EasyUI 数据表格datagrid列自适应内容宽度的实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
Apr 16 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
Dec 26 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
Jul 29 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
Oct 23 Javascript
jquery中取消和绑定hover事件的实现代码
Jun 02 Javascript
浅谈js的url解析函数封装
Jun 28 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
jQuery轻松实现无缝轮播效果
Mar 22 jQuery
关于页面刷新vuex数据消失问题解决方案
Jul 03 Javascript
解决vue 更改计算属性后select选中值不更改的问题
Mar 02 Javascript
微信小程序实现录音功能
Nov 22 Javascript
nuxt 实现在其它js文件中使用store的方式
Nov 05 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
Jul 18 #Javascript
jquery实现下载图片功能
Jul 18 #jQuery
jQuery实现图片下载代码
Jul 18 #jQuery
使用react context 实现vue插槽slot功能
Jul 18 #Javascript
jquery图片预览插件实现方法详解
Jul 18 #jQuery
vue使用自定义指令实现拖拽
Jan 29 #Javascript
对TypeScript库进行单元测试的方法
Jul 18 #Javascript
You might like
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
YII实现分页的方法
2014/07/09 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
jquery 插件学习(四)
2012/08/06 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
python解析xml模块封装代码
2014/02/07 Python
Python实现的最近最少使用算法
2015/07/10 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
请说出几个常用的异常类
2013/01/08 面试题
计算机专业应届毕业生自荐信
2013/09/26 职场文书
文秘个人求职信范文
2014/04/22 职场文书
迎七一演讲稿
2014/09/12 职场文书
撤诉书怎么写
2015/05/19 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript