首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >流外DOM操作

流外DOM操作
EN

Stack Overflow用户
提问于 2014-04-22 18:00:37
回答 2查看 373关注 0票数 0

这是从https://developers.google.com/speed/articles/javascript-dom得到的

据我所知,附加/移除元素会导致再流。换班也是。但是,在解决方案中,您需要附加删除,从而导致为问题代码的折返数的两倍。当然,并不是所有的更新都是相同的,那么类名更改是否比附加/删除更新更昂贵呢?我遗漏了什么使解决方案代码比问题代码更有效?

此模式允许我们创建多个元素并将它们插入DOM中,从而触发单个重流。它使用一种叫做DocumentFragment的东西。我们在DOM之外创建一个DocumentFragment (因此它超出了流)。然后,我们创建并添加多个元素。最后,我们将DocumentFragment中的所有元素移动到DOM中,但是触发一个单一的重流。 问题所在 让我们创建一个函数来更改元素中所有锚点的className属性。我们可以通过迭代每个锚点并更新它们的href属性来做到这一点。问题是,这可能会导致每个锚的回流。 函数updateAllAnchors(element,anchorClass) { var锚= element.getElementsByTagName('a');for (var i= 0,length = anchors.length;i< length;i ++) { anchorsi.className = anchorClass;} 解决方案 为了解决这个问题,我们可以从DOM中删除元素,更新所有锚,然后将元素插入回原来的位置。为了帮助实现这一点,我们可以编写一个可重用的函数,它不仅从DOM中删除一个元素,而且还返回一个函数,该函数将元素插入到它原来的位置。 /** *移除一个元素,并提供一个函数将其插入到它原来的位置* @param元素{ element },该元素将临时删除*@返回{ function }一个函数,该函数将元素插入其原始位置**/ removeToInsertLater(元素){ var parentNode = element.parentNode;var nextSibling = element.nextSibling;parentNode.removeChild(元素);返回函数{ if (nextSibling) {parentNode.insertBefore(元素,nextSibling);}element.parentNode{parentNode.appendChild(元素);}} 现在,我们可以使用这个函数来更新超出流的元素中的锚,并且只有在删除元素和插入元素时才触发重新流。 函数updateAllAnchors( anchorClass) { var insertFunction =removeToInsertLater(元素);var锚点= element.getElementsByTagName('a');for (var i= 0,length = anchors.length;i< length;i ++) { anchorsi.className = anchorClass;}insertFunction()};

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-22 18:08:19

假设您想要更改100万个元素的类。

直接这样做会导致每一个类都有100万个-one -。

但是,如果您从DOM中删除它的父类,更改所有类,并将其插入回它,那就只有2个重构-because,在文档之外更改元素并不会导致重流-。

因此,基本上,删除和重新插入是更有效的,如果你有很多元素。如果你只有几个就没必要这么做了。

票数 2
EN

Stack Overflow用户

发布于 2014-04-22 18:10:14

根据解决办法:

为了解决这个问题,我们可以从DOM中删除元素,更新所有锚,然后将元素插入回原来的位置。

因此,在这种情况下,它将触发2个重构(一个用于删除,另一个用于插入)。因此,当您希望一次修改两个以上的元素时,此解决方案就适用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23226971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档