11

達成したいことには、またはと文字列のいずれcreateElement()かを使用できinnerHTMLます。

最終的に本当に速いのはどれですか?私は長い間、文字列は同じ結果を返す組み込み関数よりもはるかに遅いと信じるようになりましたが、それは本当に本当ですか?

試してみましcreateElement()たが、各要素に追加する必要のあるすべてのプロパティの速度が低下しているようです。それだけでなく、より多くのスペースを必要とします。配列の長さに基づいて1から無限大までのループがありますが、速度が低下する兆候を示す前に、最大50個程度の要素を追加することが望ましいです。これらの50ほどの要素の中に、私が作成したい要素はさらに約10個あります。つまり、実際には約500個の要素が作成されています。

組み込み関数を使用して要素を作成することで、通常よりも少し遅くなることに気付きました。その配列をリセットすることに騙されたため(配列は5Dであり、同じスクリプトに設定されていませんでした)、どちらを知りたいですか。すべてを実行する前に、速度と単純に優れたプラクティスの両方に関して、本当に優れています。

4

3 に答える 3

5

この問題のパフォーマンスの違いは、ブラウザー間、および (場合によっては) 1 つのブラウザーの異なるバージョン間で異なります。この問題についてさまざまなアドバイスを提供している記事をいくつか見てきました。

私自身の経験では、大きな Web ページに大きな変更を加える必要が実際にあったことを 1 回だけ思い出しました。具体的には、それぞれが多数のセルを持つ何百または場合によっては何千もの行を含むテーブル要素を再構築することでした。文字列変数を作成し、最後に innerHTML を 1 回設定すると、DOM 関数を使用して実行するよりもはるかに高速でした。ただし、これは特定のイントラネット Web アプリ用であり、ユーザーの 100% が IE を使用していることが保証されていたため、クロスブラウザー テストについて心配する必要はありませんでした。

ストリング構築の道に進むことにした場合でも、それをスピードアップする方法についてはさまざまな意見があります. 文字列の末尾に継続的に追加する (標準myString += 'something' + 'something else'型操作) パフォーマンスと、配列変数の末尾に追加してから Array.join() を使用して 1 つの大きな文字列を作成するパフォーマンスを比較した複数の記事を読みました。終わり。繰り返しになりますが、これは一部のブラウザーの特定のバージョンでは大きな違いをもたらしましたが、他のブラウザーでは違いがなかったり、悪化したりしていませんでした.

于 2011-05-04T05:29:39.143 に答える
2

innerHTML は、既存の要素に追加したり埋めたりする大量のコンテンツがある場合に意味があります。

少し前までは、DOM メソッドは要素の innerHTML プロパティへの割り当てよりもはるかに遅かったのですが、最近は非常に高速であり、すべての呼び出しが必要なため不便です。ただし、負担を軽減するために、要素の作成に必要なすべての情報を含むオブジェクトを受け入れるヘルパー関数を作成できます。

innerHTML の使用にはいくつかの注意事項があります。

  1. 他の兄弟の間に多数の兄弟ノードを挿入することは困難です。これを行うには、HTML を他の要素 (div など) に挿入し、作成した要素を DOM に移動します。残念ながら、これには documentFragment を使用できないため、子ノードを反復処理する必要があります
  2. テーブルで使用すると問題が発生する可能性があります。IE は、TD 以外のテーブル内のさまざまな要素の innerHTML を変更することを好みません。
  3. ブラウザーは異なる HTML を innerHTML プロパティとして生成するため、それを使用して要素をシリアル化することは問題があります
  4. innerHTML プロパティを使用すると、innerHTML によって変更されていなくても、他の要素のリスナーが削除される場合があります。

例えば

<div id="div0">div0</div>

<!-- Button to add a click listener to above div -->
<button onclick="
  var el = document.getElementById('div0');
  el.onclick = function(){alert(this.id);}
">Add listener as property</button>

<!-- Button to modify the body's innerHTML -->
<button onclick="
  var body = document.getElementsByTagName('body')[0];
  body.innerHTML += '';
">Append to body.innerHTML</button>

最初のボタンをクリックしてdiv0にクリック リスナーを追加できますが、2 番目のボタン (何もしないように見えますが、実際には innerHTML をリセットします) をクリックすると、リスナーが削除されます。

于 2011-05-04T05:22:04.547 に答える
1

あなたは自分の質問に部分的に答えたと思います。

innerHTML を使用して挿入する HTML の非常に大きなチャンクでない限り、速度は実際には影響を受けません。createElement を使用すると、より「DOM フレンドリー」になりますが、小さな変更を加えるために、より多くのコード行が必要になる場合があります。

個人的には、innerHTML を使用するか、プロパティで jQuery が使用するものは何でも使用し.html()ます。しかし、ループを使用して複雑なジョブを実行する必要がある場合は、create 要素を使用します。

最終的には、重要でないパフォーマンスの違いはあるものの、すべてが同じになります。ブラウザーがドキュメントをリフローすると、同じ方法でドキュメントにアクセスできます。

于 2011-05-04T03:58:49.263 に答える