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 相关文章推荐
点击下载链接 弹出页面实现代码
Oct 01 Javascript
jQuery toggle()设置CSS样式
Nov 05 Javascript
js 第二代身份证号码的验证机制代码
May 12 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
Jun 29 Javascript
AngularJS中处理多个promise的方式
Feb 02 Javascript
在JavaScript中对HTML进行反转义详解
May 18 Javascript
javascript中Number的方法小结
Nov 21 Javascript
浅谈从React渲染流程分析Diff算法
Sep 08 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
Nov 27 Javascript
js canvas实现写字动画效果
Nov 30 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
Sep 02 Javascript
解决vue自定义指令导致的内存泄漏问题
Aug 04 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预定义常量
2006/12/25 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
简单实现php上传文件功能
2017/09/21 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
js模拟类继承小例子
2010/07/17 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
17个Python小技巧分享
2015/01/23 Python
Python单例模式实例详解
2017/03/01 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
蛋白质世界:Protein World
2017/11/23 全球购物
复古服装:RetroStage
2019/05/10 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
Sony C++笔试题
2013/03/10 面试题
高三政治教学反思
2014/02/06 职场文书
竞聘书模板
2014/03/31 职场文书
水毁工程实施方案
2014/04/01 职场文书
工会工作先进事迹
2014/08/18 职场文书
委托证明书
2014/09/17 职场文书
售后服务质量承诺书
2015/04/29 职场文书