一般的に言えば、DOM を繰り返しヒットすることは、HTML の大きなブロックを innerHTML と交換することよりもはるかに遅くなります。これには2つの理由があると思います。1つはリフローです。ブラウザは、多種多様な要素の潜在的なレイアウトへの影響を再計算する必要があります。もう1つは、私が間違っている場合は誰かが私を訂正してくれると信じていますが、レンダリングとレイアウトの状態がオブジェクトに処理されているブラウザのコンパイル後の実行環境で起こっていることを翻訳することに少しオーバーヘッドがあるということです。 JavaScript で使用できます。DOM は常に変化する状況下にあることが多いため、あらゆる種類の結果をキャッシュする機会がほとんどない状態で毎回プロセスを実行する必要があります。おそらく、追加せずに新しい要素を作成するだけの場合でも (
DOM メソッドを使用すると、実際のドキュメント レイアウトに影響を与えることなく、ドキュメント フラグメントを構築し、HTML 要素を作成してフラグメントに追加できるため、不要なリフローを回避できます。
しかし、ここからが奇妙になります。
基本的に、innerHTML が悪臭を放つとすれば、大規模なスワップが発生しているティアダウン プロセスで悪臭を放つ傾向にあります。DOM メソッドはティアダウンには優れていますが、新しい HTML の作成や、大きな違いがまったくない場合に何も置換せずに直接挿入するのは遅くなる傾向があります。
実際には、必要なときにパフォーマンスのために非常に素晴らしいことを実行できるハイブリッド メソッドが存在します。私は 1 年以上前に 1 つを使用しましたが、innerHTML のみを使用する場合と比較して、大量の HTML コンテンツを遅延読み込みグリッドに交換する場合の応答時間の改善にかなり感銘を受けました。これを理解し、ウェブ上で綴った功績に値する人へのリンクを見つけられたらいいのにと思います(著者は、正規表現もたくさん書いています-私の人生ではグーグルできませんでした)。
スタイルとパフォーマンスの問題として、実際の DOM ノード構造を繰り返し微調整することは避けるべきだと思いますが、事前にドキュメント フラグメントで HTML を構築するか、innerHTML を使用するかは、ほとんど判断の問題です。JS には、データを HTML 対応の文字列にすばやく変換できる強力な文字列メソッドが多数あるため、個人的には innerHTML が大部分気に入っています。例えば:
var htmlStr = '<ul><li>' + arrayOfNames.join('</li><li>') + '</li></ul>';
そのワンライナーは、innerHTML に直接割り当てることができる UL です。適切なデータ構造と単純な while ループを使用して完全なテーブルを構築するのは、ほぼ同じくらい簡単です。次に、DOM API を使用して、arrayOfNames の長さと同じ数の LI を持つ同じ UL を作成します。自分自身にそれをする正当な理由はあまり思いつきません。innerHTML は、最終的に HTML 5 仕様に採用される前に、何らかの理由でデファクト スタンダードになりました。DOM API のノードベースの htmlElement オブジェクト調整アプローチには合わないかもしれませんが、強力であり、コードを簡潔で読みやすく保つのに役立ちます。ただし、innerHTML を使用して既存のコンテンツを編集および置換することはおそらくしないでしょう。古い HTML を参照して属性の innerHTML 文字列の解析を開始するよりも、データから作業し、構築し、新しい HTML に交換する方がはるかに安全です。
あなたの主なパフォーマンスの懸念は、おそらくDOMの「ライブ」部分を叩くことを避けることですが、残りはHTML生成に関するスタイルとテストの問題として人々に任せます。ただし、innerHTML は HTML5 ワーキング ドラフトにあり、現在も何年もの間、最新のブラウザー間でかなり一貫しています。また、それ以前の数年間は事実上の仕様であり、Chrome が新しくなる前からオプションとして完全に実行可能でしたが、IMO ですが、それは現時点でほとんど行われている議論です.