d3操纵html的最佳方法是什么?

时间:2013-01-08 23:11:43

标签: javascript dom d3.js

我正在使用mbostock's awesome d3进行简单html渲染,这是我能想到的最简单的方法,选择一个空div并用HTML填充。

d3.select($('#thediv')[0])
  .selectAll('p')
  .data(l).enter()
  .append('p')
  .html(function(d){return 'd3 ' + d;});

Win7 Chrome中我注意到,对于大型数据集,这似乎非常慢。(20000项目为3.5秒)

此示例呈现一个非常简单(尽管很长)的列表:http://jsfiddle.net/truher/NQaVM/

我尝试了两种解决方案,可见性切换:

$('#thediv').toggle()

写入分离的元素:

var p = $('<div>')
d3.select(p[0])...
$('#theparent').append(p)

结果如下:

Firefox:统一快速(600-700毫秒)

Chrome:切换或分离的速度很快(800毫秒),否则非常慢(3.5秒)

Internet Explorer:分离更快但仍然很慢(1.8秒),否则非常慢(3.2秒)

我的问题是:有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

通常,在进行DOM操作时最终会变慢的两件事是对DOM树和浏览器重绘的修改。

使用可见性切换可以避免在任何现代优化的DOM引擎中重新绘制浏览器。你仍然会支付修改DOM树的价格。

编辑一个分离的元素将为您提供无重绘功能以及无需支付DOM更新的费用。

在所有情况下,第二个选项,即流程DOM操作,将更快或更快。浏览器之间的速度相对差异可能是由于他们的DOM和Javascript引擎的差异。有一些benchmarks可能会让您更深入地了解这一点。

除了DOM操作本身的速度之外,您还可以开始查看loop unrollingother optimizations(由Jeff Greenberg)来最小化您的实际脚本所做的工作。除此之外,你已经做好了。

如果您有兴趣了解有关浏览器内部的更多详细信息,请务必查看html5rock关于浏览器内部的长篇文章。关于如何加速网页中的JavaScript,还有一篇关于Google developers的文章。