前端对jQuery的jsTree插件的大量数据处理性能优化实践(单节点打开速度优化)

经过上一篇文章的优化之后,加载速度有了明显的提升,但是又有了新的问题

如果一个节点下有50000个子节点,打开节点时,需要20s的时间!并且打开时页面会卡顿;

打开节点卡顿原因:

查看源码打开节点的逻辑,在open_node()方法中通过调用draw_children()的方法绘制子节点,再通过选择器直接将子节点的display为none属性去掉,实现展示子节点的功能。

通过打印时间戳发现draw_children方法花费的时间不是很长,50000条数据大致在2s-3s的时间,但是单独一个修改样式的操作,将内联样式display为none去掉,让css中的display为block样式生效就花费了很长时间,一定是DOM节点一下添加这么多的节点导致的问题,于是想到了下面的解决方法:

解决大量的dom节点渲染卡顿问题:

通过一步步的摸索实践,最终实现的方式

1、通过修改源码  让他先绘制1000个节点,打开速度就是按照3000节点的速度打开,提高打开速度

2、打开节点之后然后通过documentFragment()创建节点,再append进去

3、一下append很多的节点还是会卡,于是想到了通过requestAnimationFrame()来分批次创建节点

具体代码实现:

jstree在open_node时调用draw_children来绘制子节点,我先让他绘制1000个子节点,在源码的draw_children()方法中修改,修改后的draw_children()方法:

draw_children : function (node) {
			var obj = this.get_node(node),
				i = false,
				j = false,
				k = false,
				d = document;
			if(!obj) { return false; }
			if(obj.id === $.jstree.root) { return this.redraw(true); }
			node = this.get_node(node, true);
			if(!node || !node.length) { return false; } // TODO: quick toggle

			node.children('.jstree-children').remove();
			node = node[0];
		
			if(obj.children.length && 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值