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 相关文章推荐
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
Feb 27 Javascript
js实现在同一窗口浏览图片
Sep 17 Javascript
DOM 高级编程
May 06 Javascript
jQuery满意度星级评价插件特效代码分享
Aug 19 Javascript
学习jQuey中的return false
Dec 18 Javascript
详细总结Javascript中的焦点管理
Sep 17 Javascript
jQuery验证表单格式的使用方法
Jan 10 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
Mar 09 Javascript
bootstrap时间插件daterangepicker使用详解
Oct 19 Javascript
使用Vue组件实现一个简单弹窗效果
Apr 23 Javascript
js变量声明var使用与不使用的区别详解
Jan 21 Javascript
javascrit中undefined和null的区别详解
Apr 07 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
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
php for 循环使用的简单实例
2016/06/02 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
使用Python爬取最好大学网大学排名
2018/02/24 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
详解python 爬取12306验证码
2019/05/10 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
python实现超市商品销售管理系统
2019/10/25 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
蒂娜商店:Tiina the Store
2019/12/07 全球购物
社区志愿者心得体会
2014/01/03 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
考勤制度通知
2015/04/25 职场文书
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB