[解決済み] jQuery: ページの下に外部JSがある場合、なぜdocument.readyを使用するのですか?
質問
私は、ページの一番下に読み込まれる外部ファイルとして、すべてのJSを含んでいます。これらのファイル内で、私はいくつかのメソッドをこのように定義しており、私はreadyイベントから呼び出します。
var SomeNamepsace = {};
SomeNamepsace.firstMethod = function () {
// do something
};
SomeNamepsace.secondMethod = function () {
// do something else
};
$(document).ready(function () {
SomeNamepsace.firstMethod();
SomeNamepsace.secondMethod();
});
しかし、ready 関数を削除してメソッドを直接呼び出すと、すべてが同じように動作し、実行速度も大幅に速くなります。ドキュメントはこの時点で読み込まれるはずなので (すべてのマークアップが script タグの前に来るので)、ready イベントをまだ使用する正当な理由があるのでしょうか?
どのように解決するのですか?
いい質問ですね。
ページの一番下にスクリプトを配置する」というアドバイス全体と、それがどのような問題を解決しようとするのかについて、いくつかの混乱があります。この質問では、ページの下部にスクリプトを配置することがパフォーマンスやロードタイムに影響するかどうかについては話すつもりはありません。私が話すつもりなのは、あなたが
$(document).ready
が必要かどうかについてだけ話します。
.
スクリプトですぐに呼び出しているこれらの関数で DOM を参照しているものと思われます(たとえば
document
または
document.getElementById
). また、これらの[DOM参照]ファイルについてだけ尋ねているのだと思います。つまり、ライブラリ スクリプトまたは DOM 参照コードが必要とするスクリプト (jQuery など) は、ページ内のより早い段階に配置する必要があります。
あなたの質問に答えるために
: もしあなたがDOM参照スクリプトをページの一番下に含んでいるなら、 いいえ、必要ありません。
$(document).ready
.
説明
:
なし
の助けを借りずに
"onload"
-のような関連する実装を
$(document).ready
経験則によれば、ページ内の DOM 要素と相互作用するコードは、それが参照する要素よりもさらに下に配置/インクルードされるべきです。最も簡単なのは、そのコードを閉じる
</body>
. 参照
をご覧ください。
と
はこちら
. また、IEの恐ろしい
操作が中断されました。
.
とはいえ、これは決して
$(document).ready
. ロードされる前にオブジェクトを参照することは、DOM JavaScript を始めるときに最もよくある間違いのひとつです(数え切れないほど目撃しました)。この問題に対するjQueryの解決策は、このスクリプトが参照するDOM要素に対してどこに含まれるかを考える必要がないことです。これは、開発者にとって大きなメリットです。開発者が考えなければならないことが 1 つ減っただけなのです。
また、DOM を参照するすべてのスクリプトをページの一番下に移動することは、しばしば困難か非現実的です (たとえば、すべてのスクリプトが
document.write
を発行するスクリプトはそのままでなければなりません)。また、テンプレートをレンダリングするフレームワークを使用していたり、動的な javascript の一部を作成している場合、その中に含まれる必要がある関数を参照するために
の前に
js の前に含める必要がある関数を参照しています。
最後に、以前は DOM を参照するすべてのコードを、quot; best practice" として
window.onload
に詰め込むのがベストプラクティスでしたが、現在では
$(document).ready
の実装に取って代わられました。
の実装に取って代わられました。
.
これらすべてを足すと
$(document).ready
は、DOM 要素の参照が早すぎるという問題に対する、はるかに優れた、実用的で一般的な解決策であることがわかります。
関連
-
[解決済み] ユーザーがDIVの外側をクリックしたときに、jQueryを使用してDIVを非表示にする
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み] ページの下まで自動でスクロールさせる
-
[解決済み] デベロッパーツールを使って、Chromeのボタンや要素で実行されるコードを調べる方法
-
[解決済み】Twitter Bootstrapのツールチップを動的に作成された要素に結合するにはどうすればよいですか?
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
-
[解決済み] ページ読み込み後にjqueryのコードを実行するには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
-
[解決済み] $(document).readyは必要ですか?