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 相关文章推荐
javascript得到XML某节点的子节点个数的脚本
Oct 11 Javascript
自己动手开发jQuery插件教程
Aug 25 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
Dec 30 Javascript
jquery prop的使用介绍及与attr的区别
Dec 19 Javascript
基于jquery编写分页插件
Mar 07 Javascript
教你如何在Node.js中使用jQuery
Aug 28 Javascript
Vue.js用法详解
Nov 13 Javascript
JS实现仿微信支付弹窗功能
Jun 25 Javascript
基于AngularJs select绑定数字类型的问题
Oct 08 Javascript
vue实现数字动态翻牌的效果(开箱即用)
Dec 08 Javascript
vue项目或网页上实现文字转换成语音播放功能
Jun 09 Javascript
TypeScript实用技巧 Nominal Typing名义类型详解
Sep 23 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/11/28 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
一次因composer错误使用引发的问题与解决
2019/03/06 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
python和pyqt实现360的CLable控件
2014/02/21 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
基于Python实现定时自动给微信好友发送天气预报
2018/10/25 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
迟到检讨书900字
2014/01/14 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
小学优秀学生评语
2014/12/29 职场文书
辞职信怎么写
2015/02/27 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL