JS のパフォーマンスに疑問があります。
次のコードがあるとします。
var divContainer = document.createElement("div"); divContainer.id="container";
var divHeader = document.createElement("div"); divHeader.id="header";
var divData = document.createElement("div"); divData.id="data";
var divFooter = document.createElement("div"); divFooter.id="footer";
divContainer.appendChild( divHeader );
divContainer.appendChild( divData );
divContainer.appendChild( divFooter );
document.getElementById("someElement").appendChild( divContainer );
このコードは、グリッドを作成する他の関数のシェルを作成するだけです。グリッドを作成するプロセスは非常に複雑で、多くの検証が必要です。現在、グリッドを埋めるために 2 つのメソッドを使用しています。1 つは配列変数で html 全体を作成します。もう 1 つは要素を作成し、それらを a に追加しますdocumentFragment
。
私の質問は、私が理解しているように、フラグメントを使用するときにパフォーマンスに関して本当に改善があるかどうかです-フラグメントはメモリ上の要素を管理するため、ドキュメントに添付されないため、DOM の再計算やその他の厄介なものをトリガーしません。しかし、私が変数を作成している方法では、コンテナを実際のページに追加するまで、変数はどのDOM要素にも添付されません。
したがって、以前のコードは、次のようにすべてをラップするドキュメントフラグメントを使用するよりもパフォーマンスが優れているかどうか疑問に思っていました:
var fragment = document.createDocumentFragment();
var divContainer = document.createElement("div"); divContainer.id="container";
var divHeader = document.createElement("div"); divHeader.id="header";
var divData = document.createElement("div"); divData.id="data";
var divFooter = document.createElement("div"); divFooter.id="footer";
divContainer.appendChild( divHeader );
divContainer.appendChild( divData );
divContainer.appendChild( divFooter );
fragment.appendChild( divContainer )
document.getElementById("someElement").appendChild( fragment.cloneNode(true) );
すでに述べたように、これはパフォーマンスに関する質問です。ベスト プラクティスとしてフラグメントの使用が推奨されていることは知っていますが、それを行うと単にメモリ内に新しいオブジェクトが作成され、何もしないので、この場合フラグメントを捨てることは有効だと思います。
うまくいけば、何人かのjsの第一人者/神がここに希望の光を当てて、この問題を解決してくれることを願っています.
編集:だから、私はこの問題に関連するものを探していましたが、documentFragments が必ずしもパフォーマンスの向上を意味するわけではないようです。
これは、ノードの単なる「メモリ内」コンテナです。フラグメントと a の違いは、<div>
フラグメントには親がなく、DOM 上にあることはなく、メモリ内にあることです。つまり、DOM の操作がないため、フラグメントに対して行われる操作は高速です。
documentFragments に関するW3Cのドキュメントは非常に曖昧ですが、要点を言えば、誰もが好むブラウザーは実際のフラグメントを使用せず、代わりにこの MSDN ドキュメントに従って新しいドキュメントを作成します。つまり、IE のフラグメントは遅くなります。
したがって、変数に要素(たとえば)を作成するが、それをDOMに追加しない場合、要素(div、テーブルなど)などを追加し、すべての作業が完了した後(ループ、検証、要素のスタイリング)、その要素が追加されますが、フラグメントと同じですか?<div>
IEが「偽の」フラグメントを使用しているという事実を考えると、少なくともIEではそのアプローチを使用する(フラグメントではなくdivなどの要素を使用する)方が良いと思います.IEは本当に気にしませんが、テストしてください(オフィスのポリシー)。
また、次のように配列にすべての html を作成すると:
var arrHTML = ["<table>","<tr>", ....];
そして、これを行います
document.getElementById("someElement").innerHTML = arrHTML.join("");
IE の方がはるかに高速ですが、他の主要なブラウザー (FF、Chrome、Safari、Opera) は、コンテナーを使用してから追加 (フラグメントまたは div) するとパフォーマンスが向上します。
これはすべて、すべての要素を作成するプロセスが非常に高速に行われるためです。24 列で最大 20,000 行を作成するのに約 8 秒から 10 秒かかります。多くの要素 / タグですが、ブラウザーは数秒フリーズするようです。それらはすべて一度に追加されます。1つずつ追加しようとすると、地獄です。
皆さん、ありがとうございました。これは本当に面白くて楽しいものです。