それはすべて、DIV が DOM に挿入される方法に依存します。理想的には、メモリ内に DIV を構築し、単一のアクションでそれらを DOM に挿入する必要があります。これを行うにはさまざまな方法があります (さまざまな完全な例については、ベンチマーク テスト ケースを参照してください)。
jQuery を使用する場合、次のように要素をメモリ内に構築できます。
var i = 1000;
var aHTML = [];
while (i--) {
aHTML.push("<div>a new div</div>");
}
var sHTML = aHTML.join("");
var domElmt = $(sHTML);
次に、その DIV を DOM に挿入します。
$('body').append(domElmt);
jQuery を使用しない場合はcreateDocumentFragment
、cloneNode
、appendChild
、 などを使用する必要があります。これらはネイティブ ブラウザー メソッドであり、最速になります (Intel Q8200 で Chrome 21 を使用すると約 2 倍の速度を達成できます) が、これらのネイティブ メソッドを使用すると、複雑な DOM 構造を構築する必要がある場合は、使用が難しくなります。ネイティブ メソッドには、クロス ブラウザ サポートの問題もある可能性があります。
これがどのように機能するかに興味がある場合は、John Resig によるこの古い投稿をチェックしてください: http://ejohn.org/blog/dom-documentfragments/
これを、各 DIV で DOM にアクセスするメソッドと比較してください。
var i = 1000;
while (i--) {
$('body').append("<div>a new div</div>");
}
コードの行数は少なくなりますが、非常に非効率的です。
jsPerf DOM 挿入ベンチマークを実行する
Chrome を搭載した私のコンピューターでのベンチマークでは、DIV をメモリにレンダリングして一度にすべて注入する方が、個々の DIV を DOM に個別に注入するよりも 38 倍高速です。
最終的に、DOM トラバーサル/操作は避けたいものです。反復的な DOM トラバーサル/操作はコストのかかる操作であり、DIV の 1000x1000 キャンバス (特に古いブラウザー) では確実に行き詰まります。
編集:この質問を投稿して以来、@RobG、@Devu と私は、さまざまな DOM 挿入方法のさまざまなベンチマーク テストをまとめました。一部のブラウザー (Chrome、Safari)createDocumentFragment
では、cloneNode
、 などを使用するのが最速の方法ですが、驚くべきことに他のブラウザー (FireFox 15、Internet Explorer など) では、 を介して長い HTML 文字列を作成し、array.join()
via を挿入するinnerHTML
のが実際には最速の方法です。