高性能JavaScript DOMプログラミング(1)_javascriptスキル
DOM は XML および HTML ドキュメントを操作するためのアプリケーション プログラミング インターフェイスであり、DOM を操作するためにスクリプトを使用すると非常にコストがかかることはわかっています。 DOM と JavaScript (ここでは ECMScript) がそれぞれ 1 つの島であり、ECMAScript が DOM にアクセスするたびに、この橋を通過して「橋の通行料」を支払う必要があると想像してください。 DOM へのアクセス回数が増えるほど、コストが高くなります。したがって、推奨されるアプローチは、できるだけ少ない数の橋を渡り、ECMAScript アイランドにとどまるようにすることです。 DOM インターフェースを使用しないことは不可能ですが、プログラムの効率を向上するにはどうすればよいでしょうか?
1. DOM へのアクセスと変更
DOM 要素へのアクセスにはコストがかかります (ご存知のとおり、「料金」がかかります)。また、要素の変更には、ブラウザがページの幾何学的変更 (リフローと再描画) を再計算する必要があるため、さらにコストがかかります。
もちろん、最悪のシナリオはループ内の要素にアクセスまたは変更することです。次の 2 つのコードを見てください:
var times = 15000; // code1 console.time(1); for(var i = 0; i < times; i++) { document.getElementById('myDiv1').innerHTML += 'a'; } console.timeEnd(1); // code2 console.time(2); var str = ''; for(var i = 0; i < times; i++) { str += 'a'; } document.getElementById('myDiv2').innerHTML = str; console.timeEnd(2);
その結果、最初の実行時間は 2 回目の実行時間よりも 1,000 倍長くなりました。 (クロームバージョン44.0.2403.130m)
1: 2846.700ms 2: 1.046ms
コードの最初の部分の問題は、各ループ反復で要素が 2 回アクセスされることです。1 回目は innerHTML の値を読み取るため、もう 1 回目は値を書き換えるためです。つまり、ループがブリッジを通過するたびに ( re-Rowingとredrawについては次の記事で説明します)!この結果は、DOM へのアクセス回数が増えるほど、コードの実行が遅くなることを明確に示しています。そのため、削減できるDOMアクセス数を極力減らし、ECMAScript側に処理を任せることになります。
2. HTML コレクションと DOM の走査
DOM の操作でエネルギーを消費するもう 1 つのポイントは、DOM の走査です。一般に、getElementsByTagName() や document.links などを使用して HTML のコレクションを収集します。これについては誰もがよく知っていると思います。コレクションの結果は、リアルタイムで「ライブ状態」で存在する配列のようなコレクションです。つまり、基になるドキュメント オブジェクトが更新されると自動的に更新されます。どう言えばいいでしょうか?栗をあげるのはとても簡単です:
<body> <ul id='fruit'> <li> apple </li> <li> orange </li> <li> banana </li> </ul> </body> <script type="text/javascript"> var lis = document.getElementsByTagName('li'); var peach = document.createElement('li'); peach.innerHTML = 'peach'; document.getElementById('fruit').appendChild(peach); console.log(lis.length); // 4 </script>
そして、これが非効率の原因です。配列の最適化操作と同じように、長さ変数をキャッシュしても問題ありません (コレクションの長さの読み取りは、毎回クエリを実行する必要があるため、通常の配列の長さを読み取るよりもはるかに時間がかかります)。 >
console.time(0); var lis0 = document.getElementsByTagName('li'); var str0 = ''; for(var i = 0; i < lis0.length; i++) { str0 += lis0[i].innerHTML; } console.timeEnd(0); console.time(1); var lis1 = document.getElementsByTagName('li'); var str1 = ''; for(var i = 0, len = lis1.length; i < len; i++) { str1 += lis1[i].innerHTML; } console.timeEnd(1);
0: 0.974ms 1: 0.664ms
「High-Performance JavaScript」では、別の最適化戦略を提案しています。「配列の走査はコレクションの走査よりも速いため、最初にコレクションの要素を配列にコピーすると、そのプロパティへのアクセスがより速くなります。」と述べています。このパターンはあまりよく分かりませんでしたので、気にしないでください。テスト コードは次のとおりです。 (ご質問がございましたら、お気軽にご相談ください)
console.time(1); var lis1 = document.getElementsByTagName('li'); var str1 = ''; for(var i = 0, len = lis1.length; i < len; i++) { str1 += lis1[i].innerHTML; } console.timeEnd(1); console.time(2); var lis2 = document.getElementsByTagName('li'); var a = []; for(var i = 0, len = lis2.length; i < len; i++) a[i] = lis2[i]; var str2 = ''; for(var i = 0, len = a.length; i < len; i++) { str2 += a[i].innerHTML; } console.timeEnd(2);
console.time(1); var lis1 = document.getElementsByTagName('li'); console.timeEnd(1); console.time(2); var lis2 = document.querySelectorAll('li'); console.timeEnd(2); // 1: 0.038ms // 2: 3.957ms
var elements = document.querySelectorAll('#menu a'); var elements = document.querySelectorAll('div.warning, div.notice');

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

JavaScriptはPowerPointで実行でき、外部JavaScriptファイルを呼び出したり、VBAを介してHTMLファイルを埋め込んだりすることで実装できます。 1. VBAを使用してJavaScriptファイルを呼び出すには、マクロを有効にし、VBAプログラミングの知識を持つ必要があります。 2。JavaScriptを含むHTMLファイルを埋め込みます。これは、シンプルで使いやすいが、セキュリティ制限の対象となります。利点には、拡張機能と柔軟性が含まれますが、欠点にはセキュリティ、互換性、複雑さが含まれます。実際には、セキュリティ、互換性、パフォーマンス、ユーザーエクスペリエンスに注意を払う必要があります。
