有人能證明給我的建議是here(複製如下)關於刪除dom元素之前修改它們,然後重新插入它們更快。Javascript性能 - Dom Reflow - Google文章
通過證明,我想看到一些數字。他們非常喜歡研究這個,但是我認爲這篇文章非常薄弱,沒有具體說明'問題'究竟是什麼以及解決方案如何解決速度問題(文章標題爲加速JavaScript)
文章....
亂的流DOM操作
這種模式讓我們創建多個元素,並將它們插入到DOM觸發單迴流。它使用了一種叫做DocumentFragment的東西。我們在DOM之外創建一個DocumentFragment(所以它是不流動的)。然後,我們爲此創建並添加多個元素。最後,我們將DocumentFragment中的所有元素移動到DOM,但觸發一次迴流。 問題
讓我們來創建一個函數,它改變一個元素中所有錨點的className屬性。我們可以通過迭代每個錨點並更新它們的href屬性來完成此操作。問題是,這可能導致每個錨的迴流。
function updateAllAnchors(element, anchorClass) {
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
}
解決方案
爲了解決這個問題,我們可以從DOM刪除元素,更新所有錨,然後插入元素回原處。爲了實現這一點,我們可以編寫一個可重用的函數,它不僅從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);
}
};
}
現在我們可以使用此功能即出即用的流單元內更新的錨,只會引發迴流,當我們刪除的元素,當我們插入的元素。
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();
}
不錯的擴展,但是這兩個例子似乎都爲我做了相同數量的重繪。任何你可以在pastebin.me上進行演示的機會:) – redsquare 2009-12-04 02:39:02
我會承認這個擴展減慢了很多事情,所以有時很難看出計算繁重的操作上的差別,例如, Google地圖縮放。 – Alex 2009-12-04 02:53:28