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

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

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

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

HTML

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

CSS

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

Q&A

解決済

4回答

3100閲覧

DOM操作とは何を指すのか

uroboros

総合スコア20

JavaScript

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

HTML

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

CSS

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

0グッド

4クリップ

投稿2017/04/05 05:57

編集2017/04/05 05:58

DOM操作は遅い、というのをよく聞きます。
例えば appendChild や innerHTML などは、DOM操作してるとは思うのですが、
下記のような、要素を変数に保存するだけ、属性値を取得するだけ、などもDOM操作にあたるのかを知りたいです。

javascript

1// 要素を変数に保存する(id指定) 2var hoge = document.getElementById('hoge')

javascript

1// 要素を変数に保存する(クラス指定) 2var bar = document.getElementsByClassName('bar');

javascript

1// 属性値を取得する 2var atr = hoge.getAttribute('piyo');

(下記はHTML自体に手を加えるため、DOM操作にあたるのではと考えました)

javascript

1// 属性値を指定する 2hoge.setAttribute('piyo', 'piyopiyo'); 3 4// クラスを追加 5hoge.classList.add('hogehoge'); 6 7// クラスを削除する 8hoge.classList.remove('hogehoge'); 9 10// スタイルを追加する 11hoge.style.top = 100;

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

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

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

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

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

guest

回答4

0

ベストアンサー

DOM操作とは

下記のような、要素を変数に保存するだけ、属性値を取得するだけ、などもDOM操作にあたるのかを知りたいです。

「参照だから操作ではない」は受け取り方次第で変わる曖昧なものですが、そこは問題ではないと思います。
uroboros さんが「操作ではない」と思うならそうなのでしょうが、問題は「それがDOM操作なのか」ではなく、「遅いDOM APIなのか」ではないでしょうか。

リフローとリペイント

DOM APIが遅いといわれる所以はいくつかありますが、代表的な問題として「リフロー/リペイントが複数回発生するか否か」があります(注意: Geckoでは「リフロー」ですが、Webkitでは「レイアウト」と呼ぶそうです)。

ブラウザがJavaScriptからDOM APIを受け付けた場合、それがドキュメントツリーに影響し、要素位置に変化があるものであれば「リフロー」と「リペイント」が派生し、要素位置が変わらないものの見た目が変わる場合は「リペイント」が発生し、画面を再描画させます。
これらの再描画処理がコストが高いので出来るだけ少なくする工夫が必要です。
例えば、appendChild で何度も要素ノードを挿入するよりも createDocumentFragment で一つにした要素ノード群を1回で appendChild する方がコストが低くなります。
また、element.style.color = 'black', element.style.backgroundColor = '#fee'; のように複数回styleを変更するよりも element.classList.add('hoge') で1回でスタイルを変更する方がコストが低くなります。

複雑なDOMノードを生成する

要素ノードの下に要素ノードが入るような複雑なDOMノードを生成するDOM操作も遅いといえます。
DOM APIでは createElement, setAttribute 等で何回も関数呼び出しが発生し、処理を小分けにすることになるので積み重なると結構なコストになります。
雛形となるDOMノードを生成し、cloneNode で複製したり、template要素を利用する事である程度はコストを軽減する事が可能です。

DOM 参照系API

DOM参照系APIはこれらに合致しないので、一般には遅いDOM操作ではありません。
ただし、ECMAScript系APIと比べれば重い事に変わりはないので、不必要に変数に格納する処理は避けるべきだと考えます。
変数へキャッシュするとしてもそれが本当に効果があるのか、良く検証してみる必要があります。

Re: uroboros さん

投稿2017/04/05 06:39

編集2017/04/05 06:53
think49

総合スコア18162

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

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

uroboros

2017/04/05 07:43

みなさん回答ありがとうございました。 DOM操作で一括りするのではなく、その操作が何をやっているのか理解する必要があるようですね。 またコストを低くするという別ルートからのアプローチもあること、大変勉強になりました。
guest

0

「DOM操作は遅い」はレンダリングコストのことを言っているのでは。DOMへのアクセス自体が遅くなる主因ではないので、「属性値を取得するだけ」は「DOM操作」ではあると思いますが「遅い」とは関係ないと思います。


追記:

下記属性値についてはリフローが発生するので「遅い」に関係する可能性がありました。maisumakunさん指摘ありがとうございます!

  1. offsetTop、offsetLeft、offsetWidth、offsetHeight
  2. scrollTop、scrollLeft、scrollWidth、scrollHeight
  3. clientTop、clientLeft、clientWidth、clientHeight
  4. getComputedStyle()、あるいは IE の currentStyle

※ think49さんの提示されたリンク(http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/reflow-and-repaint-in-browser/)より引用

投稿2017/04/05 06:03

編集2017/04/05 07:36
kei344

総合スコア69398

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

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

maisumakun

2017/04/05 07:15

参照だけであっても、レイアウト系の値を取得しようとするとリフローを発生させてしまうことがあるので、そこで詰まってしまう事がありえます。
kei344

2017/04/05 07:19

すみません、「レイアウト系の値」とは width などへの参照でしょうか?
maisumakun

2017/04/05 07:22

そうですね、offsetなど、描画位置を計算しなければ正しい値の出ないものです(widthがそうなるかは状況依存です)。
kei344

2017/04/05 07:34

理解しました、指摘ありがとうございます。
guest

0

DOM = Document Object Model ですから、ドキュメントをオブジェクト化して処理している以上、全て DOM 操作です。

そもそも document 自体がオブジェクトですしね。

投稿2017/04/05 06:05

tacsheaven

総合スコア13703

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

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

0

こんなページなどを見てみました。

ここに書かれている話が一番のポイントかどうかわかりませんが、少なくとも自分は「何が遅いのか」についての一つ要因として、DOMを操作することとその後に行われるレイアウト処理の関係について分かりやすく書かれていると感じました。

JavascriptでのDOM操作に関する性能対策を話題にするものもいくつか見かけますね。それらについて自分はいろいろ読んではいないのですが、そうしたものを読んでみるのも参考になるのではないかと思います。

投稿2017/04/05 06:50

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問