JavaScript で DOM 要素にアクセスするのは遅いため、より応答性の高いページを作成するには、次のことを行う必要があります。
アクセスされた要素への参照をキャッシュする
ノードを「オフライン」で更新し、ツリーに追加します
JavaScript によるレイアウトの修正を避ける
最初の2つのことを行う方法を誰か教えてもらえますか?
ありがとうございました
JavaScript で DOM 要素にアクセスするのは遅いため、より応答性の高いページを作成するには、次のことを行う必要があります。
アクセスされた要素への参照をキャッシュする
ノードを「オフライン」で更新し、ツリーに追加します
JavaScript によるレイアウトの修正を避ける
最初の2つのことを行う方法を誰か教えてもらえますか?
ありがとうございました
これらはいくつかの抽象的な質問であり、必ずしも互いに関連しているとは限りません。
1. アクセスされた要素への参照をキャッシュする
参照をキャッシュすることは実践であり、必要になる場合もあります。要素への参照をローカルに (または、グローバルに) 維持する作業はかなり単純です。のような DOM メソッドを操作する場合document.createElement()
、通常、保存先の変数があります。これは、後で使用するためにキャッシュできる参照です。document.getElementById
要素への参照を返す、参照document.getElementsByTagName
のリストを返すdocument.querySelectorAll
、など。
2. ノードを「オフライン」で更新し、ツリーに追加します
「オフライン」と言うとき、あなたが参照しているコンテキストがよくわかりません。これは、要素 ( のような文字列を含む<div>
) が DOM に追加される前ですか?
要素を操作するには、主に次の 3 つの方法があります。
document.createElement
(とelem.appendChild
)
やや遠い過去のある日、これがページのコンテンツを操作するための絶対的な方法でした。それは、DOM とその住人をアドレス指定して操作する API のようなプログラムによる方法に慣れている「Web 開発者」コミュニティのサブセットにアピールしました。それはほとんど本当のコードのように見えました。
確かに、コードのいくつかはちょっととりとめのないものであり、それらを繰り返し作成し、追加し、追加することは、それを作成する必要のない人にとっては非常にクールに見えました.
を賢くcloneNode
使えば、DOM ノードでより妥当な結果を得ることができます。しかし、ここ数年までは良い選択肢ではなかったと思いcloneNode
ます。私はそれ、カーゴカルトとすべてを誤って覚えているかもしれません。私が間違っている場合は修正してください。
その後、IE がやってきて、私たちに...
サプライズ!これは非標準でした。どうして彼らは?唯一の問題は、それが本当に速かったことです。非常に高速です(IE6/7 も発生しなかったように、私たちは皆、忘れたいと思っています)。
DOM は... とにかく、ブラウザは遅くて非効率的で、とにかく実際のコードを実際に実行していなかったので、DOM の遅さは許容されました。しかし、その後、何らかの理由で、innerHTML
ステージ左とグルーヴィーに入りました、おい、それはDOMメソッドよりも高速でした. そして、「一日中DOMメソッドの代わりにマークアップを見つめるのが好き」な方法でエレガントに。
最終的には誰もが.innerHTML
時流に乗るようになり、現在では事実上の標準となっています。速いですよね?
良い。依存します。やるのelem.innerHTML = "<p>Hey!</p>"
が早かったです、うん。そうでしたelem.innerHTML = '<p>Hey!</p><p>Yo!</p><p>What!</p>'
。当然のことながら、人々はそれが財産であると考えました。
for 1..500 element.innerHTML += '<p>Medusa!</p>';
そこに疑似コード。問題はどこですか?私たちの活発な友人にとって、クリプトナイト+=
のようなものです。とんでもなく悪い、絶対にやらない、考えてはいけない、悪い考えです。なんで?私の知る限り、内部コンテンツを攻撃する方法に関係しているため、毎回DOMを「解体」しています。か何か。これはDOMを泣かせます。innerHTML
.innerHTML
elem.innerHTML += '...mayhem...'
DOM を怒らせないでください。
そのため、ある時点で (それは常に存在していたのでしょうか? DOM レベル 3、それが何かを意味する場合)、documentFragment
シーンがクラッシュしました。ただし、それに関するMDN の簡単なメモはそれを要約しています。メインDOMとはNode
別のものです。お父さんの DOM に移動する前に、何かを入れた小さな箱のように。
速度に関しては、ほとんどの場合遅れ.innerHTML
ており、すべて DOM プログラムなどです。気の利いた。
キャッシングに関して言えば、その多くは、コードをどのように構造化し、スコープを有利に使用するかに関係しています。たとえば、次のとおりです。
window.addEventListener('load', function () {
var target = document.getElementById('target'),
source = document.getElementById('source'),
...
source.addEventListener('click', function () {
var words = source.getElementsByTagName('span'),
total = words.length,
word;
while (word = words[--total]) {
target.appendChild(word);
}
});
});
http://jsfiddle.net/userdude/T6YLZ/
ハンドラーのスコープの上にtarget
andを保持するので、後でそれらにアクセスするときに既にそれらを持っています。to untilを追加しないので、 to move to untilが発生するまで、すべての要素を取得することはできません。source
click
words
source
window.onload
span
words
target
source.click
documentFragment
あなたはあなたの用語で s を説明しているようです。そして、彼らはクールです。私は最近彼らに出くわしたばかりですが、知っている人にとっては、彼らは数年以上そこにいたようです. したがって、あなたがその 1 人である場合は、非フラグメント DOM に挿入する前に smust.use.dom.methods(now)
を使用してください。documentFragment
ただし...elemn.innerHTML
マークアップを追加しているため、 を使用する場合があることに注意してください。テンプレート、AJAX 応答マークアップなどがあるかもしれません。
+=
するときはしないでくださいelem.innerHTML
。