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 相关文章推荐
datePicker——日期选择控件(with jquery)
Feb 20 Javascript
关于javascript 回调函数中变量作用域的讨论
Sep 11 Javascript
Jquery 自定义动画概述及示例
Mar 29 Javascript
uploadify多文件上传参数设置技巧
Nov 16 Javascript
js 数据存储和DOM编程
Feb 09 Javascript
js简易版购物车功能
Jun 17 Javascript
浅谈angular2 组件的生命周期钩子
Aug 12 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
Jan 08 Javascript
详解node字体压缩插件font-spider的用法
Sep 28 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
Nov 29 Javascript
layui表格数据重载
Jul 27 Javascript
JS实现点星星消除小游戏
Mar 24 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递归算法的详细示例分析
2013/02/19 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
js数据类型检测总结
2018/08/05 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
js实现星星打分效果
2020/07/05 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
django之常用命令详解
2016/06/30 Python
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
python实现学生管理系统
2018/01/11 Python
pandas如何处理缺失值
2019/07/31 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
实习生自我鉴定范文
2013/12/05 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
工程管理英文求职信
2014/03/18 职场文书
我的祖国演讲稿
2014/05/04 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
大学新生入学感想
2015/08/07 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
go开发alertmanger实现钉钉报警
2021/07/16 Golang