質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

3回答

1009閲覧

JSで高速なのはどっちなのか。

2001Y

総合スコア83

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2018/07/19 15:54

編集2018/07/20 10:54

JSについて詳しくないのですが、createElementで作成して入れるのと、手動でくっつけて追加するのはどちらの方が高速なのでしょうか。

js

1let a = document.createElement("a"); 2a.href = json[i].link; 3a.target = "_blank"; 4let div = document.createElement("div"); 5let strong = document.createElement("strong"); 6strong.innerText(json[i].title); 7div.appendChild(strong) 8let p = document.createElement("p"); 9p.innerText(json[i].snippet); 10div.appendChild(p) 11document.getElementById('SearchResults').appendChild(div)

js

1let o = "<a href="; 2let p = " target=&quot;_blank&quot;><div><strong>"; 3let q = "</strong><p>"; 4let r = "</p></div></a>"; 5document.getElementById('SearchResults').insertAdjacentHTML('beforeend', o + json[i].link + p + json[i].title + q + json[i].snippet + r);

また、子要素に追加するとき、insertAdjacentHTMLとappendChildどちらの方が高速なのでしょうか。
JSの基礎などでもいいので教えてください。

追記

教えていただいたFragmentを使って見ました。
テンプレ化することで高速になると聞きましたが、約10回ほどの繰り返しの場合はどちらの方が早いのでしょうか。

js

1for (let i = 0; i < length|0; i=(i+1)|0) { 2 let a = document.createElement("a"); 3 a.href = json[i].link; 4 a.target = "_blank"; 5 let div = document.createElement("div"); 6 let strong = document.createElement("strong"); 7 strong.innerText(json[i].title); 8 div.appendChild(strong) 9 let p = document.createElement("p"); 10 p.innerText(json[i].snippet); 11 div.appendChild(p) 12 fragment.appendChild(div); 13} 14document.getElementById('test').appendChild(fragment);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2001Y

2018/07/20 00:46

なるほどこんなものがあるんですね!ありがというございます!
x_x

2018/07/20 00:54

innerText()メソッドは間違いでしょうか?
guest

回答3

0

ベストアンサー

外部ソースがHTMLで与えられるような場合は別ですが、できるだけHTMLからエレメントを起こすのは避けて、setAttributeappendChildtextContentなどのエレメントを直接操作するDOM APIを使いましょう。

速度面でもたしかに有利なのですが、それより大きなメリットとして、XSS対策になるということがあります。

HTMLで書いた場合、何が来てもそのままHTMLとして解釈されますので、HTML断片が紛れ込んでいた場合もエスケープしなければそのままタグが有効となってしまいますが、textContentcreateTextNodeを使えば、何を投げ込んでも完全にテキストとしてしか認識されず、意図しないところからタグが発生してしまうこともなくなります。

属性を与える場合も、HTML文字列の合成では区切り文字などを混ぜ込むことで意図しない属性を増やされるなど、不適切なHTMLを生成させられる危険がありますが、setAttributeを使えば与えた値は必ず「1つの属性」になってくれます。

投稿2018/07/20 00:55

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/07/20 00:57

なお、innerTextはメソッドではなくプロパティなので、「node.innerText = 'string';」のように使います。
2001Y

2018/07/20 10:44

なるほど...ありがとうございます! 追記の方も教えていただければと思います。
maisumakun

2018/07/20 12:12

たった10回の操作では絶対的な時間が短いので、よほど特殊な条件でない限り気にする必要があるほどの差は出ないと思います。
2001Y

2018/07/20 15:13

なるほど、そうなると文字の少ない無理やり書いた方が良いのかもしれませんね!
guest

0

innerTextを修正しても両者は違う処理です。
前者:divを突っ込んでいる
後者:エスケープしていない

最適化が進んでいて、ループ回数での場合分けもしているみたいですのでなかなか比較は難しいのですが、このような0.1msにも満たない処理を気にするのは繰り返し処理するからだと思います。
その場合はDocumentFragmentを使いましょう。テンプレートも使い、あらかじめ各ノードを取得しておけばいいです。
https://html5experts.jp/yoshikawa_t/1932/
(ここの例はあらかじめノードを取得していません。もっと速くできます)

投稿2018/07/20 02:09

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2001Y

2018/07/20 10:44 編集

Fragment知りませんでしたありがとうございます! 追記の方も教えていただければと思います。
guest

0

原則おなじような冗長な処理をするならDOMの方がコストが高いでしょう
しかしDOMもFragmentしたり繰り返し処理をCloneで処理したりすると
効率化を図れるので必ずしもパフォーマンスが悪いとはいえません
逆にDOMを使わない場合、すべてが文字列としてあつかわれるということになり
任意にエスケープ処理などをしないといけないので、
その分描画や文書構造の構築以外の部分でのコストがかかります。

参考:DOM操作の最適化によるJavaScriptチューニング

投稿2018/07/20 00:55

yambejp

総合スコア114825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2001Y

2018/07/20 10:44

Fragment知りませんでしたありがとうございます! 追記の方も教えていただければと思います。
yambejp

2018/07/20 10:48

奇しくもx_xさんと同じページの紹介になってますね
2001Y

2018/07/20 10:53

そうでした。 しかし、下の方にも気にする必要はないなど、詳しく書いてあってわかりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問