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编程起步(第二课)
Jan 10 Javascript
jquery中对表单的基本操作代码
Jul 29 Javascript
JS函数验证总结(方便js客户端输入验证)
Oct 29 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
Nov 22 Javascript
浅谈Javascript Base64 加密解密
Dec 28 Javascript
AngularJs Modules详解及示例代码
Sep 01 Javascript
vue-cli+webpack记事本项目创建
Apr 01 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
javascript计算渐变颜色的实例
Sep 22 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
详解Vue 的异常处理机制
Nov 30 Vue.js
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
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&amp;mysql(三)
2006/10/09 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
两级联动select刷新后其值保持不变的实现方法
2014/01/27 PHP
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python的语言类型(详解)
2017/06/24 Python
set在python里的含义和用法
2019/06/24 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
企划经理的岗位职责
2013/11/17 职场文书
十八大报告观后感
2014/01/28 职场文书
调解协议书
2014/04/16 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
车辆挂靠协议书
2016/03/23 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python