DOMContentLoadedイベントとloadイベントの違い


回答:


191

Mozillaのデベロッパーセンター

DOMContentLoadedイベントは、スタイルシート、画像、サブフレームの読み込みが完了するのを待たずに、ドキュメントが完全に読み込まれて解析されたときに発生します(loadイベントを使用して、完全に読み込まれたページを検出できます)。


27
Fyi、同じMDNリンク[今]も次のように述べています。 DOMContentLoadedは、スタイルシートが読み込まれるまで起動しません。」
Nick

10
@Nickこのページには理由が記載されています。html5rocks.com/en/tutorials/internals/howbrowsersworkページの動画をご覧になることをお勧めします。
abhisekp

1
@abhisekp素晴らしいチュートリアルですが、そのビデオリンクは廃止されました
supi

そのため、DOMContentLoadedが発生した後にレンダーツリーが構築されます。しかし、DOMContentLoadedはに従って仕上げ負荷に画像/サブリソース/サブフレームを待ちませんdeveloper.mozilla.org/en-US/docs/Web/API/Window/...。これらの画像/サブフレーム/サブリソースが構築後にレンダーツリーによって呼び出されたか、レンダーツリーの構築中にDOMツリーによってすでに呼び出されたかを知っていますか?言い換えると、レンダーツリーはこれらの画像/サブフレーム/サブリソースをダウンロードするために多数の接続をトリガーしますか、それともそれらのダウンロードは以前にすでに進行中でしたのですか?
weefwefwqg3

83

DOMContentLoadedイベントは、すぐにDOM階層が完全に構築されているように、発火するloadすべての画像とサブフレームが完成ロードを持っている場合、イベントがそれを行います。

DOMContentLoaded最新のほとんどのブラウザで動作しますが、IE9以上を含むIEでは動作しません。jQueryライブラリで使用されているような古いバージョンのIEでこのイベントを模倣するいくつかの回避策があり、IE固有の onreadystatechangeイベントをアタッチします。


7
「このイベント」と言うとき、どのイベントを指しますか?
トムハバード

2
「このイベント」= DOMContentLoaded。IE8では機能しません。サポートする必要がある場合は、CMSがリンクしている回避策を使用してください
Jan Derk

53

違いを自分で確認してください:

デモ

Microsoft IEから

DOMContentLoadedイベントは、現在のページの解析が完了すると発生します。loadイベントは、広告や画像を含むすべてのリソースからすべてのファイルの読み込みが完了すると発生します。DOMContentLoadedは、UI機能を複雑なWebページに接続するために使用する優れたイベントです。

Mozilla Developer Networkから

DOMContentLoadedイベントは、スタイルシート、画像、サブフレームの読み込みが完了するのを待たずに、ドキュメントが完全に読み込まれて解析されたときに発生します(loadイベントを使用して、完全に読み込まれたページを検出できます)。


DOMContentLoaded(延期/非同期を含む)すべてのスクリプトがロードされていることを保証は?スクリプトについては何も言われていません:developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey

@Sergey Nope。非同期リソース-つまり<script async src = app.js />-はページの残りの部分とは無関係に読み込まれるため、リソースがサーバーからフェッチされる前にDOMContentLoadedがトリガーされる可能性があります
Mehrad Sadegh

1
@MehradSadegh私はあなたが間違っていると思います!MDNドキュメンテーションから:defer属性を持つスクリプトは、スクリプトがロードされて評価が完了するまで、DOMContentLoadedイベントの発生を防ぎます。:あなたはことを確認、それ、このSOの質問を見てみることができますstackoverflow.com/questions/42950574/...
radzak

1
@Jatimir遅延属性と非同期属性の動作は異なると思います。
Mehrad Sadegh

1
@Jatimirとにかく投稿してくれてうれしいです。あなたの投稿は正確に私が探していたものだったからです!ありがとうございました!
Robert Wildling

29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

ドキュメントは「準備ができる」までは、ページを安全に操作できません。jQueryはこの準備状態を検出します。$(document).ready()内に含まれるコードは、ページのドキュメントオブジェクトモデル(DOM)がJavaScriptコードを実行する準備ができて初めて実行されます。$(window).load(function(){...})内に含まれるコードは、DOMだけでなくページ全体(画像またはiframe)の準備ができると実行されます。

参照:http : //learn.jquery.com/using-jquery-core/document-ready/


1
問題はjQueryに関するものではありません。
user34660 2017年

4
@ user34660そうではありませんが、理解するのに役立ちます。
アンダーソン

16
  • domContentLoaded:DOMの準備ができており、JavaScriptの実行をブロックしているスタイルシートがない場合のポイントをマークします。つまり、レンダーツリーを(潜在的に)構築できるようになります。多くのJavaScriptフレームワークは、独自のロジックの実行を開始する前にこのイベントを待機します。このため、ブラウザーはEventStartおよびEventEndタイムスタンプをキャプチャして、この実行にかかった時間を追跡できるようにします。

  • loadEvent:すべてのページ読み込みの最後のステップとして、ブラウザーは「onload」イベントを発生させ、追加のアプリケーションロジックをトリガーできます。

ソース


JSへのURLを含むスクリプトタグがある場合、domContentLoadedの前または後にロードされますか?
Pavan

0

これが私たちのために働くいくつかのコードです。MSIEはでヒットしたり失敗したりすることがわかりました。DomContentLoaded追加のリソースがキャッシュされていない場合(コンソールのログに基づいて最大300ミリ秒)に遅延があり、それらがキャッシュされるとトリガーが速すぎます。そこで、MISEのフォールバックに頼りました。また、外部JSファイルの前または後のdoStuff()どちらでDomContentLoadedトリガーするかに関係なく、関数をトリガーする必要があります。

// detect MSIE 9,10,11, but not Edge
ua=navigator.userAgent.toLowerCase();isIE=/msie/.test(ua);

function doStuff(){
    //
}
if(isIE){
    // play it safe, very few users, exec ur JS when all resources are loaded
    window.onload=function(){doStuff();}
} else {
    // add event listener to trigger your function when DOMContentLoaded
    if(document.readyState==='loading'){
        document.addEventListener('DOMContentLoaded',doStuff);
    } else {
        // DOMContentLoaded already loaded, so better trigger your function
        doStuff();
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.