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 相关文章推荐
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
Apr 26 Javascript
js中window.open()的所有参数详细解析
Jan 09 Javascript
js报$ is not a function 的问题的解决方法
Jan 20 Javascript
JavaScript中的Math.LN2属性用法详解
Jun 12 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
Jun 09 Javascript
JS控制FileUpload的上传文件类型实例代码
Oct 07 Javascript
BootStrap导航栏问题记录
Jul 31 Javascript
vue.js数据绑定操作详解
Apr 23 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 Javascript
react koa rematch 如何打造一套服务端渲染架子
Jun 26 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 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/10/09 PHP
php 多线程上下文中安全写文件实现代码
2009/12/28 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
微信小程序分页加载的实例代码
2017/07/11 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
Python argv用法详解
2016/01/08 Python
python判断输入日期为第几天的实例
2018/11/13 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
Python pip 常用命令汇总
2020/10/19 Python
css sprite简单实例
2016/05/23 HTML / CSS
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
linux下进程间通信的方式
2014/12/23 面试题
什么时候用assert
2015/05/08 面试题
车祸赔偿收入证明
2014/01/09 职场文书
中学教师教育感言
2014/02/21 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
营销团队口号
2014/06/06 职场文书
给老婆的道歉信
2015/01/20 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
oracle索引总结
2021/09/25 Oracle
Go并发4种方法简明讲解
2022/04/06 Golang