1. 程式人生 > >Javascript -- document的createDocumentFragment()方法

Javascript -- document的createDocumentFragment()方法

指定 子節點 動態 tag 調用 contain script () nod

在《javascript高級程序設計》一書的6.3.5:創建和操作節點一節中,介紹了幾種動態創建html節點的方法,其中有以下幾種常見方法:

· crateAttribute(name):        用指定名稱name創建特性節點

· createComment(text):       創建帶文本text的註釋節點

· createDocumentFragment():    創建文檔碎片節點

· createElement(tagname):      創建標簽名為tagname的節點

· createTextNode(text):       創建包含文本text的文本節點

其中最感興趣且以前沒有接觸過的一個方法是createComment(text)方法,書中介紹說:在更新少量節點的時候可以直接向document.body節點中添加,但是當要向document中添加大量數據是,如果直接添加這些新節點,這個過程非常緩慢,因為每添加一個節點都會調用父節點的appendChild()方法,為了解決這個問題,可以創建一個文檔碎片,把所有的新節點附加其上,然後把文檔碎片一次性添加到document中。

假如想創建十個段落,使用常規的方式可能會寫出這樣的代碼:

1 2 3 4 5 6 for(var i = 0 ; i < 10; i ++) {
var p = document.createElement("p"); var oTxt = document.createTextNode("段落" + i); p.appendChild(oTxt); document.body.appendChild(p); }

當然,這段代碼運行是沒有問題,但是他調用了十次document.body.appendChild(),每次都要產生一次頁面渲染。這時碎片就十分有用了:

1 var oFragment = document.createDocumentFragment();
1 2 3 4 5 for(var i = 0 ; i < 10; i ++) { var p = document.createElement("p"); var oTxt = document.createTextNode("段落" + i); p.appendChild(oTxt); oFragment.appendChild(p);<br>}
1 document.body.appendChild(oFragment);

在這段代碼中,每個新的<p />元素都被添加到文檔碎片中,然後這個碎片被作為參數傳遞給appendChild()。這裏對appendChild()的調用實際上並不是把文檔碎片本省追加到body元素中,而是僅僅追加碎片中的子節點,然後可以看到明顯的性能提升,document.body.appenChild()一次替代十次,這意味著只需要進行一個內容渲染刷新。

Javascript -- document的createDocumentFragment()方法