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 相关文章推荐
VBScript版代码高亮
Jun 26 Javascript
关于Javascript作用域链的八点总结
Dec 06 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
js select下拉联动 更具级联性!
Apr 17 Javascript
ES6模块化的import和export用法方法总结
Aug 08 Javascript
jQuery实现可兼容IE6的遮罩功能详解
Sep 19 jQuery
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
Vue.js实现图片的随意拖动方法
Mar 08 Javascript
React 组件中的 bind(this)示例代码
Sep 16 Javascript
详解JavaScript中关于this指向的4种情况
Apr 18 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
Jul 18 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
json简单介绍
2008/06/10 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
Python  连接字符串(join %)
2008/09/06 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
国际贸易专业个人求职信格式
2014/02/02 职场文书
财务部经理岗位职责
2014/02/03 职场文书
创业计划书如何编写
2014/02/06 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
应届生简历自我评价
2015/03/11 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
靠谱的活动总结
2019/04/16 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
Python如何配置环境变量详解
2021/05/18 Python
Python基础 括号()[]{}的详解
2021/11/07 Python
实战Python爬虫爬取酷我音乐
2022/04/11 Python