jQuery EasyUI Datagrid性能优化专题

jQuery EasyUI的Datagrid组件功能算是很强大了,不过性能确实不怎么乐观,而对于性能问题,网络上几乎也找不到相关的优化资料,所谓的牛人们可能 都望而却步了。本博客以后会带着分析Datagrid组件的性能问题,并且给出优化方案,也希望大家能集思广益,给出一些好的想法。

慢在哪些方面

以目前对Datagrid的了解程度去看待性能问题,主要有以下几点:

加载大数据量时比较慢(不考虑服务端返回数据的时间),这点尤其体现在IE浏览器里面;

大数据量时,加载后,操作很不流畅,勾选慢,singleSelect为true的话点选也比较慢,IE浏览器也是尤其突出;

数据量一般,但是字段特别多的话,加载和操作也比较慢,当然了,这种情况比较少见;

可编辑表格的性能则是更为糟糕,数据量达到几十条的时候,操作就会相当不流畅,IE依旧很突出

大数据量的加载

原因分析

不考虑服务端返回数据的时间,在前台获取到大数据量后,往表格里插入tr的时候,IE执行的效率非常低,2000条数据要45秒左右,其他浏览器则很快。

通过单步调试发现,默认视图在最后将tr写到table里面用的是jQuery的html()函数,就是这个函数在IE下执行效率非常低。

解决方案一:返璞归真

jQuery是个很锋利的工具,可有时候我们也得返璞归真一下,为什么非要用jQuery的html()函数呢,我们就用javascript dom对象里面的innerHtml属性不就可以了么,而且换成innerHTML属性方式的话,效率提高几十倍。

所以,大数据量加载慢的问题,就这么简单就解决了,修改默认视图render方法最后那句:

//1.3.3版本是这样的,其它版本也是这句代码

$(_1e0).html(_1e4.join(""));

改为:

$(_1e0)[0].innerHTML = _1e4.join("");

注意:innerHTML虽然符合w3c标准,而且各个浏览器也都支持,但是表现出的行为却又差异,另类的浏览器依旧是IE,主要表现在以下几个方面:

IE6,IE7,IE8浏览器设置innerHTML属性会忽略html5属性和标签,搜索关键词"innerHTML IE html5";

IE几乎所有版本设置innerHTML属性时都会把href,src属性自动转化为绝对路径,搜索关键词"innerHTML IE href";

IE几乎所有版本的table相关标签的innerHTML属性是只读的(td除外),搜索关键词"innerHTML IE table;

幸运的是EasyUI的datagrid默认视图没有使用html5技术,调用innerHTML的节点也并非table节点(是div),而href,src等转化为绝对路径并没有什么影响。

解决方案二:使用scroll视图

VirtualScrollView视图官网已经写出来了,不过有两个Bug而已,我对这个视图的源码也分析过,请大家参照:

http://www.easyui.info/archives/1404.html

勾选和点选

原因分析

勾选和点选(开启singleSelect)慢的原因其实是一样的,都是选择器执行效率低,这里我拿勾选的情况来分析。

具体的分析过程我就不描述了,知道用chrome,fireBug,IE开发者工具调试的同学,应该都有定位问题的思路:先定位执行效率低的函数,再在函数内定位执行效率低的语句。

checkbox导致操作不流畅的原因,我最后定位到opts.finder.getTr这个方法上,我们来看它的代码片段:

if(type == "checked") {

return(_21d == 1 ? dc.body1 : dc.body2).find(">table>tbody>tr.datagrid-row:has(div.datagrid-cell-check input:checked)");

}

这段代码是获取已经被勾选的rows,大家可以看到,这是纯粹的jQuery选择器查询,效率就慢在has这个伪选择器上,它是针对所有后代元素的,查找的效率是比较慢的,又是在这么多数据量的情况下,其效果就可想而知了。

优化方案一:选择器优化

其实对于checkbox列的DOM结构是固定的,我们完全可以用速度快的选择器来代替":has",我们先直接用路径选择器找到"input:checked",然后使用三次parent()函数返回tr,写法虽然复杂了,但是效率应该提高一点,所以我们改成这样:

if(type == "checked") {

return(_21d == 1 ? dc.body1 : dc.body2).find(">table>tbody>tr.datagrid-row>td>div.datagrid-cell-check>input:checked").parent().parent().parent();

}

我用自己的服务大概测试了修改前后的效率(jQuery版本1.8.0,EasyUI版本1.3.3,singleSelect为false,2000条数据勾选一条记录的测试情况):

浏览器 执行时间 浏览器 执行时间
原版 IE9 600ms chrome 60ms
选择器优化 IE9 560ms chrome 60ms

从上面的结果可以看出,在这种测试条件下,我们提高的效率并不大,IE9下提高的效率尽管有所提高,但是还是很不理想,而chrome下性能基本一 样。测试过程中发现,如果使用jQuery2.0的话,IE9下的执行时间将达到45000ms,几乎让人奔溃,看来尽管IE9勉强支持 jQuery2.x,但是效率很挫。

优化方案二:实时记录优化法

既然慢在DOM结构巨大时,jQuery选择器的搜索效率不是很好(特别是在IE下)。如果我们每次操作都记录下勾选的tr,那么就完全可以绕开选择器。

具体该怎么做呢,我们给$.data(target,'datagrid')变量增加两个属性:"checkedTrsBody1" 和"checkedTrsBody2"分别存储frozen部分和normal部分被勾选tr的引用,然后在各个设计到勾选的操作中维护这两个属性。最 后,获取被勾选tr的时候就可以直接从这两个属性中取了,其耗时是可以忽略的。

那么究竟哪些操作会影响到被勾选的tr呢,我们罗列一下,也就以下几 种:"checkRow","uncheckRow","uncheckAll","checkAll","deleteRow","loadData","load","reload". 我们只要在这些接口中维护起"checkedTrsBody1"和"checkedTrsBody2"属性姐可以了。

至于具体的代码怎么改,我就不贴了,最好就直接改动源码了,思路很清晰,请各位自己去实现,是在理不出头绪的,请参照我的实现:

http://www.easyui.info/version/jquery-easyui-1.3.3/plugins/jquery.datagrid.js

数据报表统计

以下是一些测试报表,测试环境请看报表标题(Y轴为耗时,单位毫秒;X轴为数据量):

勾选性能测试【IE9;jQuery-1.8.0;EasyUI-1.3.3;singleSelect:false】优化执行时间(ms)原版执行时间(ms)200条500条1000条2000条4000条6000条8000条10000条-1k0k1k2k3k4kHighcharts.com

可以看出来,无论是在IE9下,勾选效率都提高了很多倍(chrome下效率也有显著提高)。对于开启singleSelect的优化思路是一样的,所以不写重复文字了。

渲染性能测试【IE9;不考虑服务器响应时间】优化渲染时间(ms)原版渲染时间(ms)200条500条1000条2000条4000条6000条8000条10000条-50k0k50k100k150k200k250kHighcharts.com

对于原版的datagrig,我本地的测试环境数据在4000条以上时,IE9基本就卡死了(可能机器性能不太好),无统计价值了,即便是4000条数据,也要将近2分钟才渲染完,显然没人能够忍受。

从报表很明显可以看出优化过的表格,即便是10000条数据,3秒也就渲染完成了。

优化演示

未优化版本:http://www.easyui.info/version/jquery-easyui-1.3.3/demo/datagrid/bigdata_checkbox.html

优化版本:http://www.easyui.info/version/jquery-easyui-1.3.3/demo/datagrid/bigdata_checkbox_optimized.html

jQuery EasyUI Datagrid性能优化专题

时间: 2024-08-05 23:40:41

jQuery EasyUI Datagrid性能优化专题的相关文章

jQuery EasyUI Datagrid性能优化专题(转)

jQuery  EasyUI的Datagrid组件功能算是很强大了,不过性能确实不怎么乐观,而对于性能问题,网络上几乎也找不到相关的优化资料,所谓的牛人们可能 都望而却步了.本博客以后会带着分析Datagrid组件的性能问题,并且给出优化方案,也希望大家能集思广益,给出一些好的想法. 慢在哪些方面 以目前对Datagrid的了解程度去看待性能问题,主要有以下几点: 加载大数据量时比较慢(不考虑服务端返回数据的时间),这点尤其体现在IE浏览器里面: 大数据量时,加载后,操作很不流畅,勾选慢,sin

[JS][easyui]jQuery EasyUI Datagrid VirtualScrollView视图简单分析

 大家都知道EasyUI的Datagrid组件在加载大数据量时的优势并不是很明显,相对于其他一些框架,如果数据量达到几千,便会比较慢,特别是在IE下面.针对这种情况,我们首要做的是要相办法优化datagrid组件的各方面性能,不过任何事情都是可以变通解决的,virtualScrollView就是一种不错的解决方案. virtualScrollView的准则就是尽量少画tr到table里,表格的高度是有限的,而用户的可见区域是很有限的,所以数据量很大的时候,是没有必要将所有数据数据都画到表格中

jquery easyui datagrid 排序列

点击排序列,将获取参数有:page=1&rows=10&sort=UserName&order=desc c#后台获取sort跟order参数 string sortColumn = Request.Params["sort"].ToString(); string order = Request.Params["order"].ToString(); jquery easyui datagrid 排序列,布布扣,bubuko.com

Jquery easyui datagrid 导出Excel

datagrid的扩展方法,用于将当前的数据生成excel需要的内容. 1 <script> 2 /** 3 Jquery easyui datagrid js导出excel 4 修改自extgrid导出excel 5 * allows for downloading of grid data (store) directly into excel 6 * Method: extracts data of gridPanel store, uses columnModel to constru

jquery easyui datagrid设置行样式 不可删除某行

rowStyler: function (index,row) { if (parseInt(row.ksrs) > 0) { return 'color:red'; } }, onLoadSuccess:function(data){ var rows = data.rows; for (var j = 0; j < rows.length; j++) { if (parseInt(rows[j]["ksrs"]) > 0) { $(".datagrid-

JQuery easyUi datagrid 中 editor 动态设置最大值最小值

前言 近来项目中使用到 easyui 来进行页面设计,感觉挺方便的,但是网上除了api外,其他有价值的资料比较少,故在此分享一点经验,供大家参考. 问题 JQuery easyUi datagrid 可编辑行的editor属性具有 min 和 max 属性,设置可以输入的最大值和最小值,但是这个是固定的,如下: [html] view plain copy {field:'workRate',title:'<%/*填报*/%><bean:message key="task.wo

jQuery EasyUI datagrid实现本地分页的方法

本文实例讲述了jQuery EasyUI datagrid实现本地分页的方法.分享给大家供大家参考.具体如下: 一般分页都是后台做,前端做无论从哪方面考虑都不合适.但是有的时候还是有这种需求. 这里重点用到了pagination的监听,以及JS数组的slice方法来完成.代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 3

jQuery EasyUI DataGrid API 中文文档

扩展自$.fn.panel.defaults,用 $.fn.datagrid.defaults重写了 defaults . 依赖 panel resizable linkbutton pagination 用法 1.  <table id="tt"></table> 1.  $('#tt').datagrid({ 2.      url:'datagrid_data.json', 3.      columns:[[ 4.          {field:'co

jQuery EasyUI datagrid列名包含特殊字符会导致表格错位

首先申明:本文所述的Bug存在于1.3.3以及更高版本中,其它低版本,本人未测试,太老的版本不想去折腾了. 洒家在写前端的SQL执行工具时,表格用了 jQuery EasyUI datagrid,因为用户的SQL是千奇百怪的,所以出现了诸如:"BLOCKS*8/1024","trunc(SYSDATE)"之类的列名(field)时,表格就会错位,而且含有特殊字符的列无法手工调整大小. 经分析,datagrid组件在画表格的时候会在宿主DOM后动态追加一个style节