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 相关文章推荐
需要做特殊处理的DOM元素属性的访问
Nov 05 Javascript
JS的replace方法详细介绍
Nov 09 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
Oct 30 Javascript
iframe子页面获取父页面元素的方法
Nov 05 Javascript
jQuery简单图表peity.js使用示例
May 02 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
Nov 26 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
Feb 16 Javascript
JS异步文件上传(兼容IE8+)
Apr 02 Javascript
js + css实现标签内容切换功能(实例讲解)
Oct 09 Javascript
微信小程序页面缩放式侧滑效果的实现代码
Nov 15 Javascript
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
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简介
2006/10/09 PHP
基于php下载文件的详解
2013/06/02 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
接收键盘指令的脚本
2006/06/26 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
webpack处理 css\less\sass 样式的方法
2017/08/21 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python删除列表内容
2015/08/04 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
详解Django中异步任务之django-celery
2020/11/05 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
保险公司晨会主持词
2014/03/22 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA