什么';在IE中使用Javascript/jQuery管理大型数据集最有效的方法是什么?
我有一个返回JSON的搜索,然后将其转换为Javascript格式的HTML表。它重复调用jQuery.append()方法,每行调用一次。我有一台现代化的机器,Firefox的响应时间是可以接受的。但在IE8中,速度慢得令人无法忍受 我决定将从数据到HTML的转换转移到服务器端PHP中,将返回类型从JSON更改为HTML。现在,我不再重复调用jQuery.append(),而是对整个表调用一次jQuery.html()方法。我注意到Firefox的速度变快了,但IE的速度变慢了什么';在IE中使用Javascript/jQuery管理大型数据集最有效的方法是什么?,javascript,jquery,internet-explorer,Javascript,Jquery,Internet Explorer,我有一个返回JSON的搜索,然后将其转换为Javascript格式的HTML表。它重复调用jQuery.append()方法,每行调用一次。我有一台现代化的机器,Firefox的响应时间是可以接受的。但在IE8中,速度慢得令人无法忍受 我决定将从数据到HTML的转换转移到服务器端PHP中,将返回类型从JSON更改为HTML。现在,我不再重复调用jQuery.append(),而是对整个表调用一次jQuery.html()方法。我注意到Firefox的速度变快了,但IE的速度变慢了 这些结果都是轶
这些结果都是轶事,我没有做过任何基准测试,但IE的性能非常令人失望。我能做些什么来加速IE中大量数据的处理,还是用AJAX/Javascript一次性处理大量数据是个坏主意?我以前做过这件事。由于每次添加后都会触发重新绘制/回流过程,所以所有DOM操作都会减慢速度 在客户端将其构建为字符串,使用
.html()
将字符串插入DOM
这对我来说非常成功,即使在IE6上也是如此。多个DOM追加操作会降低性能。您也可能会遇到字符串不变性的问题 保持数据尽可能小(JSON数组很好),并在脚本中构建html,避免javascript字符串连接问题。将html值附加到数组中,然后加入数组。创建html后执行一次DOM追加。乙二醇
var builder = [];
//Inside a loop
builder.push('<tr><td>');
builder.push(json.value);
builder.push('</tr>');
//Outside the loop
$('div').append(builder.join(''));
var-builder=[];
//圈内
建筑商推送(“”);
builder.push(json.value);
建筑商推送(“”);
//圈外
$('div').append(builder.join('');
我强烈建议
几个月来,我一直在使用John Resig的微模板功能。模板插件就是这个插件的发展。我一年来一直在写和介绍:)
正如其他人所提到的,过度的DOM操作会降低性能。使用前面提到的Array.join(“”)创建HTML字符串并使用jQuery.HTML()方法设置容器的innerHTML要快几个数量级。小心使用jQuery.append(html)-这相当于先创建所有DOM节点,然后插入它们 问题是,即使您优化了页面节点树的创建,对于非常大的数据集,您仍然会很快达到上限。浏览器无法处理如此大而复杂的DOM树。即使使用事件委派,您也会看到交互(动画、处理程序等)速度减慢。如果数据集确实很大,则需要进行某种虚拟化,以仅显示视口中可见的内容(这就是SlickGrid所做的-) 或者,您可以通过对DOM添加进行分块,并在超时的情况下逐个执行这些添加,中间有一些停顿,让浏览器处理用户事件,从而提高页面的响应能力和“交互时间”
其他技术包括渲染第一页的数据,为更多数据分配空间,但仅在用户开始向其滚动时渲染。这就是Facebook所做的。这是真的-对于大数据集,你永远不会从IE(<9)中获得好的性能,但是设置innerHTML通常比在IE中插入一堆DOM节点要快得多,不管你使用的是什么JS框架。你完全正确。。。但是“你在视口中吗?”有多快?我想你是指检查滚动位置。检查本身相当快,特别是如果你把它放在一个小的超时。请看一看SlickGrid的例子——网格渲染了50000行,但速度非常快,响应速度也非常快。我刚刚完成了SlickGrid的实现,这真是太棒了。毫无疑问,这是我使用过的最强大的jQuery插件,它使我不用重新设计一大块项目来处理IE。谢谢@很高兴你发现它很有用。