[解決済み] innerHTMLよりcreateElementの方が優れている?
質問
実際には、innerHTML よりも createElement を使用することの利点は何でしょうか。私は innerHTML を使用することがパフォーマンスとコードの可読性/保守性の面でより効率的であると確信していますが、私のチームメイトはコーディング アプローチとして createElement を使用することに同意しているので、質問しているのです。私は、createElementがより効率的になる方法を理解したいだけです。
どのように解決するのですか?
を使用することには、いくつかの利点があります。
createElement
を修正する代わりに
innerHTML
(を修正するのではなく(すでにあるものを捨てて置き換えるのではなく)、Pekkaがすでに述べたように、安全性のほかに
要素を追加するときに、DOM 要素への既存の参照を保持します。
への追加(またはその他の変更)時に
innerHTML
に追加(または変更)すると、その要素内のすべての DOM ノードが再分析され、再作成される必要があります。ノードへの参照を保存していた場合、それらはもう表示されないので、本質的に役に立たなくなります。
任意の DOM 要素にアタッチされたイベント ハンドラを保持します。
これは本当に最後のものの特殊なケースに過ぎません(よくあることですが)。設定
innerHTML
を設定しても、それが作成する新しい要素に自動的にイベントハンドラを再付与することはありません。したがって、自分でそれらを追跡して手動で追加する必要があります。イベント デリゲーションは、場合によってはこの問題を解消することができます。
場合によってはよりシンプルで高速になる可能性がある
多くの追加を行う場合、リセットし続けることは絶対に避けなければなりません。
innerHTML
をリセットし続けることは絶対に避けなければなりません。単純な変更であれば高速ですが、再解析と要素作成を繰り返すと遅くなるからです。これを回避する方法は、HTMLを文字列で構築し、その中に
innerHTML
を終了時に一度だけ設定することです。状況によっては、文字列操作の方が、単に要素を作成して追記するよりも遅くなる可能性があります。
さらに、文字列操作のコードはより複雑になるかもしれません(特に安全であることを望む場合)。
以下は、私が時々使う、より便利にするための関数です。
createElement
.
function isArray(a) {
return Object.prototype.toString.call(a) === "[object Array]";
}
function make(desc) {
if (!isArray(desc)) {
return make.call(this, Array.prototype.slice.call(arguments));
}
var name = desc[0];
var attributes = desc[1];
var el = document.createElement(name);
var start = 1;
if (typeof attributes === "object" && attributes !== null && !isArray(attributes)) {
for (var attr in attributes) {
el[attr] = attributes[attr];
}
start = 2;
}
for (var i = start; i < desc.length; i++) {
if (isArray(desc[i])) {
el.appendChild(make(desc[i]));
}
else {
el.appendChild(document.createTextNode(desc[i]));
}
}
return el;
}
このように呼び出すと
make(["p", "Here is a ", ["a", { href:"http://www.google.com/" }, "link"], "."]);
とすると、これと同等のHTMLが得られます。
<p>Here is a <a href="http://www.google.com/">link</a>.</p>
関連
-
[解決済み] jQueryを使用してdivのinnerHTMLを置き換えるには?
-
[解決済み] JSONウェブトークンの無効化
-
[解決済み] CreateElement with id?
-
[解決済み】innerText、innerHTML、valueの違い?
-
[解決済み】innerHTMLでスクリプトを挿入することは可能ですか?
-
[解決済み】React.js:Set innerHTMLとdangerouslySetInnerHTMLを比較する。
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] 各オブジェクトに?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] JSHintの'+'前の改行不良の説明
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]