Javascript 性能 - Dom Reflow - Google 文章

标签 javascript performance

有人可以向我证明给出的建议 here (在下面复制)关于在更改 dom 元素之前删除它们然后重新插入它们的速度更快。

通过证明,我希望看到一些数字。他们研究这个很好,但我认为这篇文章非常薄弱,没有包括关于“问题”到底是什么以及解决方案如何在速度方面修复的细节(如文章标题加速 JavaScript)

文章....

流外 DOM 操作

这个模式让我们可以创建多个元素并将它们插入到 DOM 中触发单次回流。它使用一种称为 DocumentFragment 的东西。我们在 DOM 之外创建一个 DocumentFragment(因此它是流外的)。然后我们创建并向其添加多个元素。最后,我们将 DocumentFragment 中的所有元素移动到 DOM,但触发一次重排。 问题

让我们创建一个函数来更改元素中所有 anchor 的 className 属性。我们可以通过简单地遍历每个 anchor 并更新它们的 href 属性来做到这一点。问题是,这可能会导致每个 anchor 的回流。

function updateAllAnchors(element, anchorClass) {
  var anchors = element.getElementsByTagName('a');
  for (var i = 0, length = anchors.length; i < length; i ++) {
    anchors[i].className = anchorClass;
  }
}

解决方案

为了解决这个问题,我们可以从 DOM 中移除元素,更新所有 anchor ,然后将元素插入到原来的位置。为了帮助实现这一点,我们可以编写一个可重用的函数,它不仅可以从 DOM 中删除一个元素,还可以返回一个将元素插入到其原始位置的函数。

/**
 * Remove an element and provide a function that inserts it into its original position
 * @param element {Element} The element to be temporarily removed
 * @return {Function} A function that inserts the element into its original position
 **/
function removeToInsertLater(element) {
  var parentNode = element.parentNode;
  var nextSibling = element.nextSibling;
  parentNode.removeChild(element);
  return function() {
    if (nextSibling) {
      parentNode.insertBefore(element, nextSibling);
    } else {
      parentNode.appendChild(element);
    }
  };
}

现在我们可以使用这个函数来更新流外元素中的 anchor ,并且仅在我们移除元素和插入元素时触发回流。

function updateAllAnchors(element, anchorClass) {
  var insertFunction = removeToInsertLater(element);
  var anchors = element.getElementsByTagName('a');
  for (var i = 0, length = anchors.length; i < length; i ++) {
    anchors[i].className = anchorClass;
  }
  insertFunction();
}

最佳答案

您会发现很难从 javascript 分析中获得有意义的数据,因为您实际上是在保存重绘和重新流动,而这在大多数分析工具中都不会出现。您可以使用 Firebug paint events extension以直观方式向您展示您保存了多少重绘。

关于Javascript 性能 - Dom Reflow - Google 文章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1844270/

相关文章:

javascript - 悬停不适用于选择选项

javascript - jquery单个var用于两个id

javascript - 链接查询树,不包含 "Rendered more hooks than during the previous render"

performance - W3C 限制 DTD/XSD 请求;有镜像或文件列表吗?

c# 如何避开内存分配瓶颈以提高多线程性能

javascript - .load() 动画与外部网页?

javascript - 从使用 .data() 添加的对象字符串中获取值

performance - jQuery 全局事件和性能?

ruby-on-rails - Rails with angular 与 Rails pure(查看性能)

java - 到处使用 `final` 修饰符的开源 Java 项目